Einführung

Oft wird pauschal gesagt: PHP ist langsam, weil es nicht zu Maschinensprache compiliert wird. Wie viel langsamer es wirklich ist weiß niemand so genau. Deshalb hier der Vergleich: C++ gegen PHP. Es wurden einfache algorythmische Aufgaben genommen, die in beiden Sprachen einfach lößbar sind. Der Code ist so weit es geht gleich.

Bei beiden Programmen wurde mit dem dem Programm time die Ausführzeit gemessen und der „user”-Wert genommen.

PHP-Programme werden mit dem PHP5-CLI-Interpreter laufen gelassen. C++-Programme werden mit gcc 4.1.2 und -O2 kompiliert. Das Testsystem läuft im 64-Bit-Modus.

Ergebnis

Primzahlen einfach

Gibt alle Primzahlen von 2 bis n aus. Zuerst der brutal einfache Algorythmus.

C++ PHP
1000 0,028s0,420s
3000 0,24s 2,0s
100001,8s 15,7s

C++-Code

#include <iostream> #include <cstdlib> int main(int argc, char* argv[]) { if(argc!=2) exit(EXIT_FAILURE); int max = strtoul(argv[1], NULL, 10); for(int i=2; i<=max; ++i){ bool is_prim = true; for(int j=2; j<i; ++j){ if(i%j == 0) is_prim = false; }; if(is_prim) {std::cout<<i; std::cout<<"\n";}; }; return EXIT_SUCCESS; };

PHP-Code

<?PHP if($argc != 2) exit(1); $max = (int)($argv[1]); for($i=2; $i<=$max; ++$i){ $is_prim = true; for($j=2; $j<$i; ++$j){ if($i%$j == 0) $is_prim = false; }; if($is_prim){echo $i; echo "\n";}; }; ?>

Primzahlen verbessert

So, diesmal ist der Code nicht absichtlich primitiv geschrieben. Dadurch wurde er einiges schneller.

C++ PHP
20000 0,028s0,21s
2000000,2s1,55s
5000000,45s5,0s

C++-Code

#include <iostream> #include <cstdlib> #include <math.h> int main(int argc, char* argv[]) { if(argc!=2) exit(EXIT_FAILURE); int max = strtoul(argv[1], NULL, 10); if(max >= 2) std::cout<<"2\n"; for(int i=3; i<=max; i+=2){ bool is_prim = true; int max_factor = (int)(sqrtf((float)i)); for(int j=3; j<=max_factor; j+=2){ if(i%j == 0){ is_prim = false; break; }; }; if(is_prim) {std::cout<<i; std::cout<<"\n";}; }; return EXIT_SUCCESS; };

PHP-Code

<?PHP if($argc != 2) exit(1); $max = (int)($argv[1]); if($max >= 2) echo "2\n"; for($i=3; $i<=$max; $i+=2){ $is_prim = true; $max_factor = (int)(sqrt($i)); for($j=3; $j<=$max_factor; $j+=2){ if($i%$j == 0){ $is_prim = false; break; }; }; if($is_prim) {echo $i; echo "\n";}; }; ?>