09. november 2011 - 18:47Der er
24 kommentarer og 1 løsning
søge i et array
array (en lang tekst, en tekst mere, en tekst mere)
kan nogen hjælpe mig med at lave en søgning i denne
hvis jeg søger på 'kst'(de sidste 3 bogstaver i tekst) skal der komme ud at den er fundet, jeg er lige glad med hvor , skal bare vide om det er i arrayet
I øvrigt kører count i konstant tid, så du vinder meget lidt ved at cache count i variablen $j. Men der er selvfølgelig ikke noget i vejen for at gøre det sådan, ville bare lige nævne det.
@Qobra: Om count så kørte i bulgarsk sommertid, så tager det væsentligt længere tid at slå array'ets længde op i hvert gennemløb af løkken. Er du i tvivl, kan du jo teste =)
Hvis kravet bliver udvidet fra, at "en tekst skal ende på 'kst'" til, at "en tekst skal ende på 'kst', men ikke må bestå af 'kst'", så skal man naturligvis teste, som du foreslår.
Det vigtige er bare at bemærke at besparelsen er konstant, altså uafhængig af antallet af elementer i arrayet. Man kunne nemlig blive fristet til at tro at count gennemløber arrayet hver gang man kalder count, men faktisk returnerer den bare en variabel. Det er helt i orden lige at spare lidt tid, ville som sagt bare lige nævne det :-)
olebole: Jeg forstår ikke hvad du mener med din sidste kommentar? Så vidt jeg kan se gør min substr sammenligning præcis det samme som din preg_match?
#10 >> Uanset, om den returnerer en variabel eller ej, så giver det jo samme resultat: Det tager væsentligt længere tid og beslaglægger mindre ressourcer =)
JensPeterSvensson: I princippet er det faktisk hurtigere at sammenligne med 0, så sparer du en minus operation. Så du kan bygge dit loop op sådan her: for ($i=count($a); $i--;) {}. Den gennemgår også elementerne {$a-1, $a-2, ..., 0}, men i omvendt rækkefølge. Om det giver en besparelse du nemt kan måle tvivler jeg på :-) I begge tilfælde sparer du dog overheadet i at kalde funktionen count.
Og ja, du sparer naturligvis tiden hver gang du ikke kalder funktionen. Men at hente værdien af $j tager langt under et ms., og at kalde count tager måske 5 gange så lang tid, altså stadig under et ms. Så dit loop skal virkelig være stort før det gør en forskel. Min pointe er, hvis count i stedet tæller elementerne i arrayet, så vil det tage længere tid at kalde count jo større arrayet er. Sådan er det heldigvis ikke, men hvis det var burde man altid gøre som olebole gør.
#12 b) Korrekt, jeg siger heller ikke at man ikke må gøre det, eller at det er en dårlig ide. Ville bare lige nævne at count ikke gør det man tror den gør :-) Personligt går jeg ikke så meget op i at lave sådan nogle små-optimeringer i php, da det i forvejen er meget langsomt og resursekrævende.
@olebole: Som sagt taler vi om en meget lille optimering, men hvis dit loop, ikke nødvendigvis gennem et array, skal køre 10^8 gange, så giver det faktisk en besparelse man kan måle. Helt præcist 2,8 sek. mod 4,6 sek. på min maskine:
$ cat testup.php <? $j = 100000000; for ($i = 0; $i < $j; $i++); ?> $ time php testup.php php testup.php 4.59s user 0.00s system 99% cpu 4.601 total $ cat testdown.php <? $j = 100000000; for ($i = $j; $i--;); ?> $ time php testdown.php php testdown.php 2.79s user 0.01s system 99% cpu 2.823 total
Jamen, det kan du da! Men kan du ikke måle forskelle med mindre antal - eller har du en speciel trang til astronomiske overdrivelser? =)
Derudover er det jo totalt uinteressant, at et enkelt loop ikke suger enorme mængder ressourcer - med mindre, man selvfølgelig kun afvikler sine sider lokalt, eller skriver/administrerer sider, ingen gider bruge. Med mange brugere og store applikationer har alle optimeringer interesse
Den optimering med at tælle ned til nul nævner jeg kun fordi JensPeterSvensson spurgte om det i #9. Da man skal lave over en million iterationer for at mærke ændringen er den ligegyldig i praksis. Jeg bruger altid selv foreach når jeg gennemløber et array.
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.