phpbar.de logo

Mailinglisten-Archive

[php] Indiziertes Array !

[php] Indiziertes Array !

Kristian =?iso-8859-1?Q?K=F6hntopp?= kk_(at)_netuse.de
Mon, 17 May 1999 11:34:51 +0200


Matthias Pigulla wrote:
> Ich denke mal, daß while() und for() intern recht 
> ähnlich aufgebaut sind, und K&R sagen da ja auch nichts zu.

In PHP sind while() und for() unterschiedlich aufgebaut, weil PHP
eine interpretierte Sprache ist. Wegen der Implementierung von
for() ist es deutlich langsamer als while(); Zeev hat da vor
geraumer Zeit mal was zu geschrieben. Man kann das auch testen:

kk_(at)_poe /tmp $ cat probe-for.php3
<?php
  for($i=0; $i<50000; $i++);
 ?>
kk_(at)_poe /tmp $ cat probe-while.php3
<?php
  $i=0;
  while($i<50000) $i++;
 ?>
kk_(at)_poe /tmp $ cat bench
#! /bin/sh --

PHP="/home/www/servers/phplib.shonline.de/cgi/php -q"

$PHP -v

echo "for 1"
time $PHP probe-for.php3
echo "while 1"
time $PHP probe-while.php3

echo "for 2"
time $PHP probe-for.php3
echo "while 2"
time $PHP probe-while.php3

echo "for 3"
time $PHP probe-for.php3
echo "while 3"
time $PHP probe-while.php3

echo "for 4"
time $PHP probe-for.php3
echo "while 4"
time $PHP probe-while.php3

echo "for 5"
time $PHP probe-for.php3
echo "while 5"
time $PHP probe-while.php3

kk_(at)_poe /tmp $ bench
3.0.8-dev
for 1

real        9.8
user        8.1
sys         0.1
while 1

real        5.2
user        5.0
sys         0.1
for 2

real        9.2
user        8.0
sys         0.1
while 2

real        7.4
user        5.0
sys         0.1
for 3

real       14.8
user        8.1
sys         0.1
while 3

real        8.5
user        4.9
sys         0.1

for 4

real       13.9
user        8.2
sys         0.0
while 4

real        5.1
user        4.9
sys         0.1
for 5

real        8.3
user        8.1
sys         0.1
while 5

real        6.5
user        4.8
sys         0.1

Von interesse ist hier weniger die WCT als die user- und
sys-Summe. Diese ist bei while konsistent im Bereich von 5
Sekunden, bei for konsistent im Bereich von 8 Sekunden. Oder
anders gesagt: while() ist 60% schneller als for().

Das wird sich erst mit Zend significant ändern.

> Gute Angewohnheit ;-). Dann solltest Du vorher ein 
> reset($feld) nicht vergessen, falls Du vorher schon 
> mal über das Feld iteriert hast.

Nicht initialisierte Variablen werden bei Warning Level 15
angemeckter, schon von daher ist "$summe = 0" essentiell. Vor
einem "reset()" auf eine Variable, die nicht definiert ein Array
ist, sollte man ein is_array()-Prädikat auswerten. Das ist
insbesondere dann notwendig, wenn das Array als GPC-Variable vom
Internet übernommen wurde; aber dann muß man ja sowieso
dekontaminieren.

Kristian

-- 
Kristian Köhntopp, NetUSE Kommunikationstechnologie GmbH
Siemenswall, D-24107 Kiel, Germany, +49 431 386 436 00
Using PHP3? See our web development library at
http://phplib.shonline.de/ (GPL)


php::bar PHP Wiki   -   Listenarchive