Ausführungsgeschwindigkeit von Variablen und Konstanten

slackfan

slackfan

König
Hallo,

ich habe zwei in PHP geschriebene Skripte. In denen eine Variable in einer For-Schleife auf eine Million hochgezählt wird. Einmal wird die Variable mit einer Konstante addiert und einmal mit einer Variable.

PHP:
#!/usr/bin/php
<?php

define(FOO, 1);
$bar = 0;

$start = microtime(true);
for($i = 0; $i < 1000000; $i++) {
    $bar += FOO;
}
$end = microtime(true);

$duration = $end - $start;

echo "\n".$duration."\n";

?>

und

PHP:
#!/usr/bin/php
<?php

$foo = 1;
$bar = 0;

$start = microtime(true);
for($i = 0; $i < 1000000; $i++) {
    $bar += $foo;
}
$end = microtime(true);

$duration = $end - $start;

echo "\n".$duration."\n";

?>

Jetzt habe ich das Phänomen, dass PHP auf meiner Kiste für das Skript mit Variable 0,262 bis 0,271 Sekunden braucht. Beim Skript mit Konstante sind es aber satte 0,392 bis 0,4 Sekunden. Das sind ja immerhin ~50% mehr Rechenzeit!
Mich würde interessieren, wo die herkommen? Liegt es daran, dass Konstanten nicht mit einem $ eingeleitet werden und der Parser/Interpiler deshalb länger braucht, um die Konstante zu identifizieren?

cu
 
Hast du das in dieser Reihenfolge nacheinander ausgeführt?
Dreh die mal um.
Immerhin ist PHP ja für seine fette Engine bekannt.

Kann das leider nicht testen, da ich mein etch ohne php betreibe. ;)
 
Nein, das sind zwei verschiedene Skripte, die ich getrennt voneinander laufen ließ. Die Ergebnisse waren immer ähnlich.
 
test1.php

Code:
#!/usr/bin/php 
<?php  
define(FOO, 1); 
$bar = 0; 
for($i = 0; $i < 1000000; $i++) { 
    $bar += FOO; 
} 
?>
test2.php
Code:
#!/usr/bin/php 
<?php 
$foo = 1; 
$bar = 0; 
for($i = 0; $i < 1000000; $i++) { 
    $bar += $foo; 
} 
?>

Code:
$ time php test1.php

real    0m0.500s
user    0m0.416s
sys     0m0.000s
$ time php test2.php

real    0m0.307s
user    0m0.300s
sys     0m0.004s
$ time php test1.php

real    0m0.418s
user    0m0.416s
sys     0m0.004s
$ time php test1.php

real    0m0.454s
user    0m0.416s
sys     0m0.016s
$ time php test1.php

real    0m0.436s
user    0m0.404s
sys     0m0.004s
$ time php test1.php

real    0m0.448s
user    0m0.416s
sys     0m0.008s
$ time php test1.php

real    0m0.447s
user    0m0.420s
sys     0m0.004s
$ time php test1.php

real    0m0.453s
user    0m0.420s
sys     0m0.008s
$ time php test2.php

real    0m0.329s
user    0m0.300s
sys     0m0.004s
$ time php test2.php

real    0m0.326s
user    0m0.300s
sys     0m0.000s
$ time php test2.php

real    0m0.330s
user    0m0.300s
sys     0m0.000s
$ time php test2.php

real    0m0.321s
user    0m0.288s
sys     0m0.008s
$ time php test2.php

real    0m0.332s
user    0m0.304s
sys     0m0.000s
$ time php test2.php

real    0m0.329s
user    0m0.304s
sys     0m0.000s
$ time php test2.php

real    0m0.328s
user    0m0.300s
sys     0m0.004s
$ time php test2.php
^[[A
real    0m0.329s
user    0m0.288s
sys     0m0.004s
$time php test2.php

real    0m0.329s
user    0m0.296s
sys     0m0.004s
ohne Worte
 
Okay, bei dir sind die Unterschiede nicht so krass, aber auch vorhanden. Aber wieso?
 
Diese Frage kann dir das Studium des PHP-Quelltextes beantworten. Die PHP Dev Mailinglisten werden ebenfalls entsprechende Threads enthalten.
 

Ähnliche Themen

ip6tables Problem

Wie komme ich an den Inhalt des Inhalts einer Variable?

Queue für copy Script

Shellskript - Fehler in Cron

JBidWatcher: Problem bei loading Auctions in Verbindung mit mySQL

Zurück
Oben