node.js, php, perl, go, c 速度比較 メモ

node.js(v8) , php ,perl, go , c でどのくらい計算速度が違うのかちょっと気になったのでメモ。

for文で1~100000000を足していく処理を行ってみる。

$ time node -e 'var sum=0; for(var i=0; i<100000000; i++){ sum+=i;} console.log(sum);'
4999999950000000

real	0m0.904s
user	0m0.900s
sys	0m0.023s
$ time php -r '$sum=0; for($i=0; $i<100000000; $i++){ $sum+=$i;} echo $sum."\n";'
4999999950000000

real	0m6.361s
user	0m6.352s
sys	0m0.007s
$ time perl -e 'my $sum=0; for(my $i=0; $i<100000000; $i++){$sum+=$i;} print "$sum\n"'
4999999950000000

real	0m11.372s
user	0m11.363s
sys	0m0.005s
$ cat test.go
package main

import("fmt")

func main() {
    sum := 0
    for i:=0; i<100000000; i++ {
        sum += i
    }

    fmt.Println(sum);
}

$ time ./test
4999999950000000

real	0m0.085s
user	0m0.082s
sys	0m0.005s
$ cat test.c
#include <stdio.h>

int main() {
    long long int i, sum=0;
    for(i=0; i<100000000; i++){
        sum+=i;
    }
    printf("%ld \n", sum);

    return 0;
}

$ time ./test_c_O0.out
4999999950000000

real	0m0.338s
user	0m0.336s
sys	0m0.001s


$ time ./test_c_O1.out
4999999950000000

real	0m0.002s
user	0m0.000s
sys	0m0.002s


$ time ./test_c_O2.out
4999999950000000

real	0m0.002s
user	0m0.000s
sys	0m0.002s


$ time ./test_c_O3.out
4999999950000000

real	0m0.002s
user	0m0.000s
sys	0m0.002s
結果

node.js(v0.10.5) : 0.904s
php(v5.3.3) : 6.361s
perl(v5.10.1) : 11.372s
go(v1.2.2) : 0.085s
c(O0)(gcc 4.4.7) :0.338s
c(O1)(gcc 4.4.7) :0.002s
c(O2)(gcc 4.4.7) :0.002s
c(O3)(gcc 4.4.7) :0.002s

node.jsが結構早い。
以外だったのがphpよりperlが遅いこと。しかもだいぶ遅いです。
goはコンパイルが必要な言語だけあってやはりそれなりに早い。Cの最適化なし(O0)より早い結果に。
Cで最適化すると圧倒的な早さ。 最適化オプションをつけると内部的な処理はぜんぜん違うものになってたりすることがあるので、この結果を信用していいかは微妙ですが。

そのうちもう少し複雑な処理で比較してみたいです。