Srovnání výkonu: PHP, Python, C

Již nějakou dobu přemítám o tom, že bych internetové aplikace rád psal v Pythonu. V těchto dnech startuji práce na další www aplikaci, která dál rozšiřuje možnosti mého eshopu a nabízí se tedy jedinečná příležitost jak s Pythonem na webu skutečně začít.

Jedním z prvních důvodů proč Python byla lepší možnost distribuce samotné aplikace po Internetu. V Pythonu stačí distribuovat PYC soubory, v PHP tohle nejde.

Dalším důvodem bylo samotné programování: v Pythonu si připadám tak nějak efektivnější, míň ukecanej a jedodušší.

No a posledním, ale asi nejdůležitějším faktorem je rychlost samotného vykonávání kódu aplikace.

Pro velice jednoduché porovnání výkonu jednotlivých jazyků jsem napsal řekněme identický kód v daném jazyce, který dělá pokažé to stejné: počítá do 1 000 000 000.
Výsledkem jsem byl velice příjemně překvapen:

Jazyk PASS SUM
PHP 64 s 116 s
Python 30 s 78 s
PyPy 4 s 4 s
C 4 s 4 s

pypy-logo
PyPy je alternativní implementace Pythonu, která nabízí několik výhod. Tou nejmarkatnější je právě rychlost kódu: aplikace je pak rychlostně srovnatelná s přeloženou aplikací v C.

Python:

from time import time

def test_cycle_pass(cyklu):
    t1 = time()
    for i in xrange(cyklu):
        pass
    return time() - t1

def test_cycle_int(cyklu):
    t1 = time()
    count = 0
    for i in xrange(cyklu):
        count += 1
    return time() - t1

cyklu = 1000000000
print("PASS : %.3f s" % test_cycle_pass(cyklu))
print("INT  : %.3f s" % test_cycle_int(cyklu))

PHP:

<?php

function test_cycle_pass($cyklu){
    $t1 = time();
    for($i=1; $i<= $cyklu; $i++){
        ;
    }
    return time() - $t1;
}

function test_cycle_int($cyklu){
    $t1 = time();
    $count = 0;
    for($i = 1; $i <= $cyklu; $i++){
        $count += $i;
    }
    return time() - $t1;
}

$cyklu = 1000000000;
printf("PASS : %.3f s\n", test_cycle_pass($cyklu));
printf("INT  : %.3f s\n", test_cycle_int($cyklu))
?>

C:

#include <stdio.h>
#include <time.h>

long test_cycle_pass(long cyklu){
    time_t start;
    int i;

    start = time(NULL);
    for(i = 1; i <= cyklu; i++){
        ;
    }
    return time(NULL) - start;
}

long test_cycle_int(long cyklu){
    time_t start;
    long count = 0;
    int i;

    start = time(NULL);
    for(i = 1; i <= cyklu; i++){
        count += i;
    }
    return time(NULL) - start;
}

int main(void){
    long cyklu = 1000000000;
    printf("PASS : %d s\n", test_cycle_pass(cyklu));
    printf("INT  : %d s\n", test_cycle_int(cyklu));
}