Al sinds C worden simpele functies geinlined, dit geldt ook voor functies waar hele simpele berekeningen gedaan worden. Je moet de compiler / runtime lekker dat soort optimalisaties laten doen. Moeilijk gaan doen over een functieaanroep is gewoon premature optimization. Helemaal als het ten koste gaat van leesbaarbeid (__CLASS__ is een goed voorbeeld, WTF?) is het gewoon een slecht idee.quote:Op maandag 22 juni 2009 11:47 schreef Intrepidity het volgende:
Hoezo? constanten staan altijd in geheugen.. Functieaanroep betekent extra dingen op de stack, geheugenlocatie veranderen, uitvoeren van die functie, terugspringen naar vorige locatie.. Dat is in iedere taal zo..
quote:Op maandag 22 juni 2009 13:21 schreef Swetsenegger het volgende:
[..]
1
2
3
4
5
6<?php
function br2nl($string)
{
return preg_replace('/\<br(\s*)?\/?\>/i', "\n", $string);
}
?>
1 2 3 4 5 6 | function br2nl($string) { return preg_replace('/\<br\s*\/?\>/i', "\n", $string); } ?> |
Maar ik selecteer helemaal geen postcodes, maar coordinaten.quote:Op maandag 22 juni 2009 11:27 schreef Catbert het volgende:
[..]
Het werkt sowieso gewoon niet. In de eerste plaats selecteer je postcodes uit een 'vierkant', en niet binnen een cirkel. Ten tweede is de aarde een bol, en lopen de meridianen niet parallel. Wat je kunt doen is de range vrij groot houden, en dan in een postprocessing stap alle postcodes die je terugkrijgt nog even te checken door de daadwerkelijke afstand uit te rekenen. Hoe je dat doet staat hier:
http://www.movable-type.co.uk/scripts/gis-faq-5.1.html
Oh, en dat je door 0.5 moet delen komt waarschijnlijk doordat uitgegaan wordt van zeemijlen i.p.v. landmijlen. Een zeemijl is 1.85 km ongeveer, en komt dus dicht bij 2km. Je factor zou dus 1/1.85 = 0.54 moeten zijn.
En toch scheelt het 20-25%:quote:Op maandag 22 juni 2009 15:16 schreef Catbert het volgende:
[..]
Al sinds C worden simpele functies geinlined, dit geldt ook voor functies waar hele simpele berekeningen gedaan worden. Je moet de compiler / runtime lekker dat soort optimalisaties laten doen. Moeilijk gaan doen over een functieaanroep is gewoon premature optimization. Helemaal als het ten koste gaat van leesbaarbeid (__CLASS__ is een goed voorbeeld, WTF?) is het gewoon een slecht idee.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // Constante $timestart = microtime(); for($i = 0; $i < 10000; $i++) { $pi = M_PI; } $timeconst = (microtime() - $timestart); echo "Tijd voor 10.000 x constante: " . $timeconst . "<br />"; // Functieaanroep $timestart = microtime(); for($i = 0; $i < 10000; $i++) { $pi = pi(); } $timefunc = (microtime() - $timestart); echo "Tijd voor 10.000 x functieaanroep: " . $timefunc . "<br />"; echo "Factor func. vs const.: " . $timefunc / $timeconst; ?> |
1 2 3 | Tijd voor 10.000 x functieaanroep: 0.0015500000000001 Factor func. vs const.: 1.2409927942355 |
Waarschijnlijk is je encoding nog gewoon ASCII of UTF-8 (ook al zegt je instruction dat het om UTF-16 gaat). Om dit te controleren, open het betreffende XML-bestand met een teksteditor die ook ondersteuning biedt om in verschillende encodings op te slaan (i.e. niet notepad), of open je document in een hex-editor en verifieer dat elk karakter uit 2 bytes bestaat (en niet 1).quote:Op maandag 22 juni 2009 11:05 schreef Intrepidity het volgende:
Iemand ervaring met UTF-16 in combinatie met SimpleXML/DOM? Ik wil een XML-bestand openen in SimpleXML of DOM, maar krijg de volgende error: SimpleXMLElement::__construct() [simplexmlelement.--construct]: Entity: line 1: parser error : Start tag expected, '<' not found
Dit teken staat er wel degelijk, en er staat geen witregel of spatie voor. Zodra ik de inhoud van dit bestand in een string stop in PHP en de string probeer te laden gaat het wel goed..
BOM?quote:Op maandag 22 juni 2009 11:05 schreef Intrepidity het volgende:
Iemand ervaring met UTF-16 in combinatie met SimpleXML/DOM? Ik wil een XML-bestand openen in SimpleXML of DOM, maar krijg de volgende error: SimpleXMLElement::__construct() [simplexmlelement.--construct]: Entity: line 1: parser error : Start tag expected, '<' not found
Dit teken staat er wel degelijk, en er staat geen witregel of spatie voor. Zodra ik de inhoud van dit bestand in een string stop in PHP en de string probeer te laden gaat het wel goed..
Betreffende eerste regel:
[ code verwijderd ]
1 2 3 4 5 6 | 1 1 10 s 2 1 10 m 3 1 10 l 4 1 12567431 l 5 1 10678096 m |
1 2 3 | <tr><td>Kleur:</td><td>12567431</td><td>maat</td>l</td></tr> <tr><td>Kleur:</td><td>10678096</td><td>maat</td>m</td></tr> |
apart tabelletje voor maten, en die linken aan het id?quote:Op maandag 22 juni 2009 23:10 schreef Swetsenegger het volgende:
Ik heb mezelf weer in een lastige mysql hoek gemanoeuvreerd....
[ code verwijderd ]
Nu moet ik als de artID en kleur gelijk is dit behandelen als 1 product in verschillende maten. Dus bovenstaand moet als volgt geparsed worden
[ code verwijderd ]
Hoe ga ik dit het handigst aanpakken. Ik zat er zelf aan te denken om in de while lus te controleren of de kleur gelijk is aan het vorige rondje, maar.... hoe pas ik dan de cel 'maat' aan in de regel ervoor....
Iemand een briljant idee?
Dat lijkt me idd de beste optiequote:Op maandag 22 juni 2009 23:13 schreef GlowMouse het volgende:
Niet je output eruit gooien middenin je code. Eerst een arraytje opbouwen $data[$artid][$kleur][] = $row.
Als je het in een andere tabel zet zoals jij voorstelt, dan zul je alsnog wat met mijn post moeten doen.quote:Op maandag 22 juni 2009 23:55 schreef PiRANiA het volgende:
[..]
Ondanks alle redundante data die op deze manier blijft bestaan?
Het is nu al in 3 tabellen opgebroken ivm de schaalbaarheid. Hoofdeigenschappen (die voor elke kleur en maat gelden) dan de eigenschappen zoals kleur, maat, etc. en een tabel foto's.quote:Op maandag 22 juni 2009 23:12 schreef PiRANiA het volgende:
[..]
apart tabelletje voor maten, en die linken aan het id?
Hmz, help me even op weg, hoe krijg ik in mijn while lus de info bij gelijke kleur in desbetreffende array entry erbij geschoven? Als ik als key gewoon de kleur pak kan ik natuurlijk de value manipuleren.... toch?quote:Op maandag 22 juni 2009 23:13 schreef GlowMouse het volgende:
Niet je output eruit gooien middenin je code. Eerst een arraytje opbouwen $data[$artid][$kleur][] = $row.
proberen en falenquote:Op dinsdag 23 juni 2009 08:23 schreef Swetsenegger het volgende:
[..]
Het is nu al in 3 tabellen opgebroken ivm de schaalbaarheid. Hoofdeigenschappen (die voor elke kleur en maat gelden) dan de eigenschappen zoals kleur, maat, etc. en een tabel foto's.
[..]
Hmz, help me even op weg, hoe krijg ik in mijn while lus de info bij gelijke kleur in desbetreffende array entry erbij geschoven? Als ik als key gewoon de kleur pak kan ik natuurlijk de value manipuleren.... toch?
dus als hij het uitvoert lockt hij de tabel?quote:
Je wil toch de insert_id gebruiken van table 1 om in table 2 te gebruiken of begrijp ik je nu verkeerd?quote:Op dinsdag 23 juni 2009 09:16 schreef cablegunmaster het volgende:
[..]
dus als hij het uitvoert lockt hij de tabel?
kan ik geen row lock doen?en voor 1x de variabele ophalen en dan in de foreach het eruithalen en daar een variabele gebruiken ?
![]()
Ja ik begrijp hoe een lusje werkt. Het ging me om de array manipulatiequote:Op dinsdag 23 juni 2009 09:15 schreef cablegunmaster het volgende:
[..]
proberen en falenals het in de database staat kun je een variabele where kleur = ' ".$kleur" ' doen en dat foreach $array as $id en daarna het weer outputten
jup. dat wil ik doenquote:Op dinsdag 23 juni 2009 09:18 schreef Swetsenegger het volgende:
[..]
Je wil toch de insert_id gebruiken van table 1 om in table 2 te gebruiken of begrijp ik je nu verkeerd?
Hij locked de table tot jij hem unlocked.quote:Op dinsdag 23 juni 2009 09:26 schreef cablegunmaster het volgende:
[..]
jup. dat wil ik doenvoor die 0.00005 sec lockt hij de tabel?
![]()
Dat heb ik net uitgelegd. Je selecteert alle coordinaten in een vierkant, niet in een cirkel. Daarnaast lopen de meridianen niet parellel. Daarom kun je beter nafilteren door naderhand nauwkeuriger de exacte afstanden uit te rekenen zodat daadwerkelijk alles binnen een straal krijgt.quote:Op maandag 22 juni 2009 16:58 schreef Likkende_Lassie het volgende:
Maar ik selecteer helemaal geen postcodes, maar coordinaten.
Toch werkt het zo goed hoor, waarom zou het niet moeten werken?
Je bewijst hier vooral mee hoe brak PHP is. Een fatsoenlijke VM zou die loop uberhaupt niet 10000 keer uitvoeren. Check dit:quote:Op maandag 22 juni 2009 18:18 schreef Intrepidity het volgende:
En toch scheelt het 20-25%:
[ code verwijderd ]
Resultaat:
[ code verwijderd ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | { LoopTest test; test = new LoopTest(); test.test1(); test.test2(); test.test1(); test.test2(); test.test1(); test.test2(); test.test1(); test.test2(); } public void test1() { long ms = System.currentTimeMillis(); for(int i = 0;i < 1000000000;i++) { double pi = Math.PI; } ms = System.currentTimeMillis() - ms; System.out.println("Test 1 took " + ms + "ms."); } public void test2() { long ms = System.currentTimeMillis(); for(int i = 0;i < 1000000000;i++) { doStuff(); } ms = System.currentTimeMillis() - ms; System.out.println("Test 2 took " + ms + "ms."); } private void doStuff() { double pi = Math.PI; } } |
Klopt, en omdat PHP geen perfecte taal is heeft het wel degelijk zin om constanten in plaats van functieaanroepen te gebruiken, dat was m'n punt..quote:Op dinsdag 23 juni 2009 10:47 schreef Catbert het volgende:
Je bewijst hier vooral mee hoe brak PHP is. Een fatsoenlijke VM zou die loop uberhaupt niet 10000 keer uitvoeren. Check dit:
[ code verwijderd ]
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |