Go, C , Pythonの簡単なベンチマークとってみた
風の噂のGoはPythonより遅い!というのは流石にない気がして、簡単なベンチをとってみた
単純な四則演算とイテレータぶん回す速度がわかれば良い。
条件
MacOSX 10.6.4 || 2.1GHz Core2 duo
gcc version 4.2.1 (Apple Inc. build 5646)
Python 2.6.1
8g version 5917
10回ほど実行した結果の平均
python | Go | C |
---|---|---|
8.22690796852 | 0.397997000 | 0.3199448585 |
だいたいイメージ通りの結果が返って来た
PythonはさすがにLLか、Goの20倍、Cの25倍程度の程度の速度
結論:
- Go本体は(たぶん)十分に早い
- 遅くなるとしたら(たぶん)ライブラリの実装が悪い
以下ベンチに使ったプログラム
pr.go
package main import "time" import "fmt" const MaxNum = 1000000 func main(){ start := time.Nanoseconds() var primeBox [MaxNum]int primeBox[0] , primeBox[1] = 1 , 1 for i:= 2 ;i < len(primeBox)/2 ;i++ { for j:= 1 ; i * (j+1) < MaxNum ; j ++ { primeBox[i*(j+1)] = 1 } } end := time.Nanoseconds() // dump // for n , i := range primeBox { // if i == 0 { // fmt.Printf("%d ",n) // } // } println("") fmt.Println("Start:",start," End:",end) fmt.Println("ExecTime:",end - start) }
pr.py
#!/usr/bin/python # encoding:utf-8 import time MaxNum = 1000000 def main(): start = time.time() prime_box = [0 for i in range(MaxNum)] prime_box[0], prime_box[1] = 1,1 for i in range(MaxNum)[2:]: j = 1 while i * (j+1) < MaxNum : prime_box[i*(j+1)] = 1 j+=1 end = time.time() # for n,i in enumerate(prime_box): # if i == 0 : print n print "Start:",start, " End:", end print "ExecTime:",end-start main()
pr.c
#include <stdio.h> #include <time.h> #include <sys/time.h> #define MAX 1000000 double gettimeofday_sec() { struct timeval tv; gettimeofday(&tv, NULL); return tv.tv_sec + (double)tv.tv_usec*1e-6; } int main(void) { double start,end; start = gettimeofday_sec(); int i, j; int p[MAX]; for(i=0 ; i<MAX ; i++) p[i] = 0; p[0] = 1; for(i=2 ; i<=MAX/2 ; i++){ for(j=2 ; i*j<=MAX ; j++){ if(p[i*j-1] == 0) p[i*j-1] = 1; } } /* for(i=0 ; i<MAX ; i++){ */ /* if(p[i] == 0) */ /* printf("%d\n", i+1); */ /* } */ end = gettimeofday_sec(); printf("ExecTime: %10.30f\n", end - start); return 0; }
*1:Cはいまいち仕様がわからないので以下からお借りしました。見た感じアルゴリズム的な違いはないはず。 エラトステネスの篩: プログラマーになりたい!