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.
Gibt alle Primzahlen von 2 bis n aus. Zuerst der brutal einfache Algorythmus.
| C++ | PHP | |
| 1000 | 0,028s | 0,420s |
| 3000 | 0,24s | 2,0s |
| 10000 | 1,8s | 15,7s |
#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
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";};
};
?>
So, diesmal ist der Code nicht absichtlich primitiv geschrieben. Dadurch wurde er einiges schneller.
| C++ | PHP | |
| 20000 | 0,028s | 0,21s |
| 200000 | 0,2s | 1,55s |
| 500000 | 0,45s | 5,0s |
#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
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";};
};
?>