/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
While vs For
Fra : Kenneth Lund-Peterse~


Dato : 07-02-02 22:17

Et hurtigt spørgsmål:
Hvad er hurtigst for en server at køre (omend vi snakker om
minimale forskelle):
En for-løkke, hvor alle elementer i et array gennemgås:

for($i=0 ; $i < sizeof($messages) ; $i++)
   {hvad nu løkken skal lave}

eller en while løkke:
while(*indtil array'et er gennemgået*)
   {hvad nu løkken skal lave}
   
Og lige en ting til..
Hvis jeg valgte at bruge en while løkke, hvilken metode er så
smartest at bruge, for at gennemgå løkken indtil arrayet er
gennemgået
Jeg tænker på noget i stil med:
while($array)
{hvad nu løkken skal lave}


--
Vil du lære at kode HTML, XHTML, CSS, SSI eller ASP ???
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

 
 
Mads Lie Jensen (07-02-2002)
Kommentar
Fra : Mads Lie Jensen


Dato : 07-02-02 23:28

On Thu, 7 Feb 2002 21:16:41 +0000 (UTC), Kenneth Lund-Petersen
<kenneth@lund-petersen.dk> wrote:

>Et hurtigt spørgsmål:
>Hvad er hurtigst for en server at køre (omend vi snakker om
>minimale forskelle):
>En for-løkke, hvor alle elementer i et array gennemgås:
>
>for($i=0 ; $i < sizeof($messages) ; $i++)
>   {hvad nu løkken skal lave}
>
>eller en while løkke:
>while(*indtil array'et er gennemgået*)
>   {hvad nu løkken skal lave}

Jeg lavede engang en mindre test af

while(list($key, $val) = each($array)) {
(som blev brugt i php3 til at gennemløbe en array)

i forhold til

foreach($array as $key => $val) {
(som findes i php4)

Den sidste var betydeligt hurtigere end den første.
   
>Og lige en ting til..
>Hvis jeg valgte at bruge en while løkke, hvilken metode er så
>smartest at bruge, for at gennemgå løkken indtil arrayet er
>gennemgået

foreach() {}


--
Mads Lie Jensen - mads@gartneriet.dk - ICQ #25478403
http://www.gartneriet.dk

Directory Opus - nu også til windows - http://www.gpsoft.com.au

Thomas Lindgaard (08-02-2002)
Kommentar
Fra : Thomas Lindgaard


Dato : 08-02-02 01:22

Davs

> Jeg lavede engang en mindre test af
>
> while(list($key, $val) = each($array)) {
> (som blev brugt i php3 til at gennemløbe en array)
>
> i forhold til
>
> foreach($array as $key => $val) {
> (som findes i php4)
>
> Den sidste var betydeligt hurtigere end den første.

Her vil jeg godt lige have lov til at indskyde en lille bemærkning: Ja,
while-løkken som du har skrevet den er langsommere end foreach - men det er
ikke while-løkkens skyld! Du kalder jo både list og each i hver iteration,
og det er der tidsforskellen opstår.

Prøv i stedet at skrive while-løkken som følger:
$i = 0;
$length_array = count($array);
while ($i++ < $length_array) { noget }

Jeg har klistret lidt kode ind nederst, som beregner summen af en masse tal
vha. while, for og foreach - prøv og kør den.

> >Og lige en ting til..
> >Hvis jeg valgte at bruge en while løkke, hvilken metode er så
> >smartest at bruge, for at gennemgå løkken indtil arrayet er
> >gennemgået

Det kommer vel an på, hvordan dit array ser ud (om det er associativt eller
bare indekseret med tallene fra 0 til mange) - det kan altid bedst betale
sig at bruge den nemmeste metode :)

I praksis vil du aldrig komme til at mærke forskel på, om du bruger den ene
eller anden metode - med mindre du arbejder med _meget_ store arrays.


Hyggehejsa
/Thomas


Koden:
<? // For vs. While
// Summere tallene fra 0 til $length_array
// (i'te indgang i array'et indeholder tallet i)

$bla_array = array();
$length_array = 100000;
for ($i = 0; $i < $length_array; $i++)
{
array_push($bla_array, $i);
}

echo "Array med tallene fra 0 til ".$length_array." er lavet\n<p>Beregner
nu summen af tallene fra 0 til ".$length_array."<p>\n";

echo "<table border=\"1\" cellpadding=\"3\">\n";

echo "<tr><td>While:</td> ";
$result = 0;
$start_time = getTimeOfDay();
$i = 0;
while ( $i++ < $length_array )
{
$result += $bla_array[$i];
}
$end_time = getTimeOfDay();
echo "<td>".(($end_time['sec'] - $start_time['sec']) * 1000 +
($end_time['usec'] - $start_time['usec']) / 1000)." ms</td></tr>\n";


echo "<tr><td>For:</td> ";
$result = 0;
$start_time = getTimeOfDay();
$iterations = count($bla_array);
for ($i = 0; $i < $iterations; $i++)
{
$result += $bla_array[$i];
}
$end_time = getTimeOfDay();
echo "<td>".(($end_time['sec'] - $start_time['sec']) * 1000 +
($end_time['usec'] - $start_time['usec']) / 1000)." ms</td><td>inklusive en
count for at finde længden af array'et</td></tr>\n";


echo "<tr><td>Foreach:</td> ";
$result = 0;
$start_time = getTimeOfDay();
foreach ($bla_array as $key => $value)
{
$result += $value;
}
$end_time = getTimeOfDay();
echo "<td>".(($end_time['sec'] - $start_time['sec']) * 1000 +
($end_time['usec'] - $start_time['usec']) / 1000)." ms</td></tr>\n";

echo "</table>";
?>




Kenneth Lund-Peterse~ (08-02-2002)
Kommentar
Fra : Kenneth Lund-Peterse~


Dato : 08-02-02 06:50

Jeg har netop kørt det script, som står nedenfor, som Thomas stod for.

Det viser sig, ved store arrays, at while er cirka 45% hurtigere end foreach

Output fra script:
---------------------------------------------
Array med tallene fra 0 til 100000 er lavet
Beregner nu summen af tallene fra 0 til 100000

While: 290.532 ms
For: 327.631 ms inklusive en count for at finde længden af array'et
Foreach: 509.629 ms
---------------------------------------------

Selvom det er små størrelser vi snakker om, taler tallene vidst for sig selv.

Iøvrigt, tak for hjælpen ang. while vs for (vs foreach).



Thomas Lindgaard wrote in dk.edb.internet.webdesign.serverside.php:
> Davs
>
> > Jeg lavede engang en mindre test af
> >
> > while(list($key, $val) = each($array)) {
> > (som blev brugt i php3 til at gennemløbe en array)
> >
> > i forhold til
> >
> > foreach($array as $key => $val) {
> > (som findes i php4)
> >
> > Den sidste var betydeligt hurtigere end den første.
>
> Her vil jeg godt lige have lov til at indskyde en lille bemærkning: Ja,
> while-løkken som du har skrevet den er langsommere end foreach - men det er
> ikke while-løkkens skyld! Du kalder jo både list og each i hver iteration,
> og det er der tidsforskellen opstår.
>
> Prøv i stedet at skrive while-løkken som følger:
> $i = 0;
> $length_array = count($array);
> while ($i++ < $length_array) { noget }
>
> Jeg har klistret lidt kode ind nederst, som beregner summen af en masse tal
> vha. while, for og foreach - prøv og kør den.
>
> > >Og lige en ting til..
> > >Hvis jeg valgte at bruge en while løkke, hvilken metode er så
> > >smartest at bruge, for at gennemgå løkken indtil arrayet er
> > >gennemgået
>
> Det kommer vel an på, hvordan dit array ser ud (om det er associativt eller
> bare indekseret med tallene fra 0 til mange) - det kan altid bedst betale
> sig at bruge den nemmeste metode :)
>
> I praksis vil du aldrig komme til at mærke forskel på, om du bruger den ene
> eller anden metode - med mindre du arbejder med _meget_ store arrays.
>
>
> Hyggehejsa
> /Thomas
>
>
> Koden:
> <? // For vs. While
> // Summere tallene fra 0 til $length_array
> // (i'te indgang i array'et indeholder tallet i)
>
> $bla_array = array();
> $length_array = 100000;
> for ($i = 0; $i < $length_array; $i++)
> {
> array_push($bla_array, $i);
> }
>
> echo "Array med tallene fra 0 til ".$length_array." er lavet\n<p>Beregner
> nu summen af tallene fra 0 til ".$length_array."<p>\n";
>
> echo "<table border=\"1\" cellpadding=\"3\">\n";
>
> echo "<tr><td>While:</td> ";
> $result = 0;
> $start_time = getTimeOfDay();
> $i = 0;
> while ( $i++ < $length_array )
> {
> $result += $bla_array[$i];
> }
> $end_time = getTimeOfDay();
> echo "<td>".(($end_time['sec'] - $start_time['sec']) * 1000 +
> ($end_time['usec'] - $start_time['usec']) / 1000)." ms</td></tr>\n";
>
>
> echo "<tr><td>For:</td> ";
> $result = 0;
> $start_time = getTimeOfDay();
> $iterations = count($bla_array);
> for ($i = 0; $i < $iterations; $i++)
> {
> $result += $bla_array[$i];
> }
> $end_time = getTimeOfDay();
> echo "<td>".(($end_time['sec'] - $start_time['sec']) * 1000 +
> ($end_time['usec'] - $start_time['usec']) / 1000)." ms</td><td>inklusive en
> count for at finde længden af array'et</td></tr>\n";
>
>
> echo "<tr><td>Foreach:</td> ";
> $result = 0;
> $start_time = getTimeOfDay();
> foreach ($bla_array as $key => $value)
> {
> $result += $value;
> }
> $end_time = getTimeOfDay();
> echo "<td>".(($end_time['sec'] - $start_time['sec']) * 1000 +
> ($end_time['usec'] - $start_time['usec']) / 1000)." ms</td></tr>\n";
>
> echo "</table>";
> ?>
>
>
>


--
Vil du lære at kode HTML, XHTML, CSS, SSI eller ASP ???
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Søg
Reklame
Statistik
Spørgsmål : 177522
Tips : 31968
Nyheder : 719565
Indlæg : 6408670
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste