Ich bin zufällig auf eine Präsentation über die kommende PHP 5.4.0 Version gestossen, mit einer Liste aller entfernten Features, neuer Features, aber auch interessanten Performance- und Speicherverbrauchdaten. Informationen über Features sind ja schon etwas länger bekannt, und im Changelog findet man auch viele Informationen, aber ehrlich gesagt konnte ich es nicht glauben was da bei den Performance-Tests steht, das mußte ich selbst ausprobieren.
Hier Beispiel 1 aus der Präsentation:
/php537/php micro_bench.php Max memory usage 1048576 bytes. Running 27.608 s. /php540/php micro_bench.php Max memory usage 524288 bytes. Running 13.254 s.
Hier Beispiel 2 aus der Präsentation:
/php537/php NewObjectClassTest.php Running 0.20629 s , 640616 bytes. /php537/php StaticClassTest.php Running 0.35047 s, 640616 bytes. /php540/php NewObjectClassTest.php Running 0.12018 s, 227808 bytes. /php540/php StaticClassTest.php Running 0.10803 s, 227880 bytes.
Hier Beispiel 3 aus der Präsentation:
for ($count = 0; $count < 10000000; $count++) { $result = 100 + 100 - 100 * 100 / 100; } /php537/php mathTest.php Running 1.75259 s, 632176 bytes. /php540/php mathTest.php Running 1.06825 s, 223208 bytes.
Das sind unglaubliche Werte, die wahrscheinlich nur erreicht werden können wenn man speziell einige Funktionen nutzt die verbessert wurden. Teilweise bis zu 75% Memory-Ersparnis und bis zu dreifacher Ausführungsgeschwindigkeit. In “normalen” Scripten dürfte die Performancesteigerung nicht so groß sein, oder?
Prüfen wir die Behauptung mal mit einem kleinen Benchmark-Script nach. Es ist sicherlich nicht sehr realitätsnah, aber immerhin besser als die spezialisierten Scripte von da oben. Ich habe mir das Script von php-benchmark-script.com heruntergeladen und dann 2 frische PHP Versionen kompiliert:
wget http://de3.php.net/get/php-5.3.8.tar.gz/from/de.php.net/mirror tar -xzvf php-5.3.8.tar.gz cd php-5.3.8 ./configure --prefix=/usr/local/php5.3.8 --with-zlib --with-config-file-path=/usr/local/php5.3.8/etc --enable-mbstring --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-zip --with-imap --with-kerberos --with-imap-ssl --with-openssl --with-jpeg-dir --with-gd --with-gettext --with-freetype-dir --enable-pcntl --enable-ftp make sapi/cli/php -v
wget http://downloads.php.net/stas/php-5.4.0beta1.tar.gz tar -xzvf php-5.4.0beta1.tar.gz cd php-5.4.0beta1 ./configure --prefix=/usr/local/php5.4.0beta1 --with-zlib --with-config-file-path=/usr/local/php5.4.0beta1/etc --enable-mbstring --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-zip --with-imap --with-kerberos --with-imap-ssl --with-openssl --with-jpeg-dir --with-gd --with-gettext --with-freetype-dir --enable-pcntl --enable-ftp make sapi/cli/php -v
und dann jeweils die bench.php ausgeführt. Hier die Ergebnisse:
PHP 5.3.8
sapi/cli/php /tmp/bench.php -------------------------------------- | PHP BENCHMARK SCRIPT | -------------------------------------- Start : 2011-09-29 17:52:30 Server : @ PHP version : 5.3.8 Platform : Linux -------------------------------------- test_math : 5.281 sec. test_stringmanipulation : 6.455 sec. test_loops : 8.263 sec. test_ifelse : 4.988 sec. -------------------------------------- Total time: : 24.987 sec.
PHP 5.4.0beta1
sapi/cli/php /tmp/bench.php -------------------------------------- | PHP BENCHMARK SCRIPT | -------------------------------------- Start : 2011-09-29 18:21:47 Server : @ PHP version : 5.4.0beta1 Platform : Linux -------------------------------------- test_math : 5.345 sec. test_stringmanipulation : 5.818 sec. test_loops : 6.865 sec. test_ifelse : 4.129 sec. -------------------------------------- Total time: : 22.157 sec.
Nach jeweils 3 Durchgängen, die alle ein ähnliches Ergebnis hatten (22 Sekunden zu 25 Sekunden), ist nun also klar: Von dreifacher Performance kann man nicht reden, aber >10% sind durchaus drin. Wäre natürlich interessant noch andere Tests zu sehen, die etwas realitätsnaher sind, und nicht von Datenbanken, Netzwerk oder ähnlichem beeinflusst werden. Ich habe gerade keins parat.
(PS: Die Werte hier stammen von einem VServer. Auf “richtiger” Hardware erhält man Laufzeiten zwischen 5 und 8 Sekunden. Dem relativen Vergleich tut das aber keinen Abbruch)