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本体は(たぶん)十分に早い
  • 遅くなるとしたら(たぶん)ライブラリの実装が悪い


以下ベンチに使ったプログラム

*1



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はいまいち仕様がわからないので以下からお借りしました。見た感じアルゴリズム的な違いはないはず。 エラトステネスの篩: プログラマーになりたい!