Avatar billede majbom Novice
08. januar 2009 - 14:50 Der er 21 kommentarer og
1 løsning

hvad er hurtigst/bedst - for, foreach eller while

jeg mener at have læst herinde et par gange at "foreach" skulle være en tung/langsom løkke at bruge og man derfor skulle bruge "for" i stedet.

jeg har så prøvet at lave en test (jeg ved ikke om det er den rigtige måde at gøre det på)

http://pastebin.com/m66f76bdc

og næsten hver gang er foreach hurtigst, nogle gange bliver den svagt overgået af for, mens while 99% af gangene er meget lang tid om det ift. de andre (en sjælden gang er den meget hurtigere :S).

så umiddelbart vil jeg mene at foreach ikke er den sløveste måde.

men måske mit test-"setup" ikke er særlig optimalt ift. at benche dette?
Avatar billede showsource Seniormester
08. januar 2009 - 14:55 #1
Nu har jeg ikke kikket på linket, men bruger du et array flere gange på samme side, skal du bruge reset() efter hver foreach, hvorimod du med en for løkke blot kører den igen.

foreach synes jeg er bedst når man ikke kender "key" på det som skal løbes igennem, og man skal bruge den.
Avatar billede jakobdo Ekspert
08. januar 2009 - 15:00 #2
Jeg mener det er den gode olebole eller arne_v som varmt taler for at bruge FOR, hvor du kan komme til det.

Dog har du jo fuldstændig ret i, at din kode der, viser foreach er hurtigst.
Avatar billede showsource Seniormester
08. januar 2009 - 15:02 #3
Nu kikkede jeg lige på siden, og hvorfor test array'et ikke "genbruges" forstår jeg ikke.

Og jeg mener det olebole :O)
Avatar billede erikjacobsen Ekspert
08. januar 2009 - 15:03 #4
Du skulle tage at gøre dine elementer i arrayet større - altså noget længere strenge.
Avatar billede jakobdo Ekspert
08. januar 2009 - 15:05 #5
Hvis du dog retter for til:

//FOR
$time_start = microtime(true);
$size = count($test);
for($i = 0; $i < $size; $i++){
    //do nothing
}
$time_end = microtime(true);
echo ($time_end - $time_start)." - FOR<br><br>";

Så er den faktisk hurtigere.

Fandt også lidt flere kode eksempler her: http://www.phpbench.com/
Hvilket faktisk er en nice side.
Avatar billede erikjacobsen Ekspert
08. januar 2009 - 15:08 #6
Og så vil det være en god idé at sætte $i=0 før whileløkken.
Avatar billede erikjacobsen Ekspert
08. januar 2009 - 15:12 #7
"Problemet" med foreach er at den laver en copy, af det du kalder $key. Jo større dims i arrayet, jo længere tid tager det. Prøv fx med 100 tegn i strengen. Det kan gøres lidt bedre med konstruktionen

    foreach($test as &$key){

som giver en reference til strengen. (som altså ikke en "nøgle" - men det er en anden sag)
Avatar billede erikjacobsen Ekspert
08. januar 2009 - 15:14 #8
Desuden er dit script urealistisk i den forstand at din while- og din for-løkken ikke slår op i arrayet for at bruge en værdi til noget. Det skal man jo normalt.

Og ja, man kan undgå at beregne size af arraet i hvert gennemløb.
Avatar billede michael_stim Ekspert
08. januar 2009 - 15:43 #9
Er det kun mig der får en masse scroll på phpbench-siden? Fungerer fint i FF. Ellers en fin side.
Avatar billede michael_stim Ekspert
08. januar 2009 - 15:44 #10
Hov, scroll forekommer i IE7.
Avatar billede majbom Novice
08. januar 2009 - 15:50 #11
http://pastebin.com/m28958f7a

nu ser det lidt anderledes ud, men umiddelbart kan jeg ikke se den store forskel, foreach er en anelse langsommere det meste af tiden, men ikke det vilde...
Avatar billede michael_stim Ekspert
08. januar 2009 - 15:59 #12
Hvis du kigger på phpbench side, i det 3. sidste eksempel, så kan du se hvor stor en forskel der er. Lad os så sige at du har et stort array, der tager f ex 0,5 sekunder at løbe igennem med for. Så kan du selv regne ud hvad det tager af tid med foreach.
Avatar billede majbom Novice
08. januar 2009 - 19:47 #13
ja okay, det bliver nok mere aktuelt jo mere der er i arrayet, men så kan man jo også se, at selv når der er 10.000 strenge á 100 tegn (1.000.000) i et array går det pænt stærkt, så man skal have gang i nogle halvstore arrays, før det tager et sekund at løbe igennem :)

tak for input, smid bare et svar alle sammen, så kan i dele points :)
Avatar billede erikjacobsen Ekspert
08. januar 2009 - 19:59 #14
Ingen point til mig, tak.
Avatar billede jakobdo Ekspert
08. januar 2009 - 20:13 #15
Svar!
Avatar billede showsource Seniormester
09. januar 2009 - 06:57 #16
hopper over
Avatar billede olebole Juniormester
09. januar 2009 - 11:41 #17
<ole>

"så man skal have gang i nogle halvstore arrays" >> Eller også skal man bare have tilstrækkeligt mange ligeglade kodere på samme webhotel server ... og det har man på rigtig mange  ;o)

/mvh
</bole>
Avatar billede majbom Novice
09. januar 2009 - 12:25 #18
-> ole - ja det er selvfølgelig rigtigt, sådan havde jeg ikke tænkt på det :) - du nåede lige at komme inden der blev delt points ud, så smid et svar!

så mangler vi bare et svar fra michael_stim
Avatar billede olebole Juniormester
09. januar 2009 - 12:32 #19
Ellers tak. Det var bare en lille sidebemærkning  ;o)
Avatar billede michael_stim Ekspert
09. januar 2009 - 12:36 #20
Ellers tak. Samler ikke og min lille sidebemærkning er vidst heller ikke mange point værd ;o)
Avatar billede majbom Novice
09. januar 2009 - 12:44 #21
jamen så går de bare til jakob...

tak for deltagelsen til alle og go' weekend :)
Avatar billede jakobdo Ekspert
09. januar 2009 - 13:28 #22
Takker for point.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester