Subscribed unsubscribe Subscribe Subscribe

sci

最果て風呂

各種言語でベンチマーキング

やっぱり比較したくなるじゃない?

先日ベンチマークをしたけれど、ちゃんとやってみる。

方法について

  1. 変換対象のテキストは青空文庫にある芥川龍之介の「桃太郎」とする。
  2. 新仮名使いを歴史的仮名使いに変換させる処理にかかった時間を計測する(timeコマンド)。
  3. キャッシュを効かせる言語もある(Pythonだったかな?)らしいので、連続で変換させるのではなく、各言語を1回ずつ順次実行し、これを5周繰り返した値の平均を比較の対象とする

結果について

1 2 3 4 5 Ave
clisp 12.907 12.630 14.041 13.985 13.821 13.4768
sblc 3.485 3.368 3.313 3.700 3.493 3.4718
Go(script) 0.469 0.463 0.578 0.493 0.433 0.4872
Go(binary) 0.148 0.136 0.131 0.129 0.131 0.135
Lua 0.870 1.137 1.157 1.122 0.840 1.0252
Python3 0.136 0.114 0.118 0.079 0.079 0.1052
Perl 0.105 0.071 0.073 0.070 0.064 0.0766
Ruby 0.101 0.120 0.096 0.100 0.095 0.1024
Gauche 0.995 1.257 1.159 1.239 0.940 1.118
Emacs 0.140 0.190 0.230 0.230 0.240 0.206
Vim 0.633 0.627 0.624 0.632 0.617 0.626
C#(mono) 0.125 0.114 0.115 0.116 0.115 0.117
Objective-C 1.004 1.019 1.022 1.024 1.032 1.022

Perl が頑張ってる感じがする。Lisp 系が遅いのは、自分が再帰とか使えないからアルゴリズム的にダメなんだろうね。

ちなみに Windows では下記の通りになった。

1 2 3 4 5
C# 2.625 2.937 2.641 2.641 2.984
Go(script) 22.641 23.172 22.031 21.718 21.718
Go(binary) 2.546 2.250 2.906 2.203 2.172
Python3 2.032 2.046 2.093 2.094 2.078
Perl 3.234 3.110 3.187 2.656 2.219
Ruby 4.015 2.406 2.078 2.266 2.234
Emacs 0.330 0.470 0.440 0.440 0.530
Vim 2.216 1.994 2.112 2.055 2.028

Windows では Go のコンパイルにかなりの時間(20秒程度)がかかってるみたい。MacBookPro 上のようにスクリプト言語的には使えなさそう。もっとも、Windows というよりも CPU が PentiumM というのが原因なのだろうけど。

ついでに iBook では下記の通りになった。

1 2 3
Perl 2.767 1.617 1.976
Python3 2.786 3.898 3.302
Ruby 4.651 5.181 3.819
lua 17.244 16.748 18.553
Emacs 3.490 3.450 3.430
Vim 11.038 11.013 11.084

PowerPC 600MHz, 384MB メモリでもまだまだ行けるぜ!

付録

数字が小さくて良くわからないので、変換させるテキストに、昔はてダで書いていたブログ記事(2.6MB)を使ってみることにした。

1 2 3
Perl 4.508 4.970 5.055
Python3 3.763 3.767 3.882
Ruby 9.535 9.670 9.800
Go(s) 15.396 24.220 20.944
Go(b) 15.127 16.485 16.620
Emacs 4.460 4.810 4.560
Vim 86.478 75.843 85.397
C#(mono) 10.454 10.405 10.533
Objective-C 240.572 233.720 233.393

入力データが大きくなると比較がしやすくなる。Go は予想外に遅かった。Go の検索置換の処理(strings.Replace())が遅いのか、for … range が遅いのか、よくわからん。やっぱりアルゴリズムなのかなぁ。Go 的にはどの関数を使えばいいんだろうか?

Vim はなんでこんなに遅いんだろう?選択範囲内のみの置換をする分には瞬時なので、普段使いには問題ないのだけどね……。

Objective-C で実装できたのでテスト。動けばいいやという継ぎ接ぎだらけのプログラムだからか、ものすごく遅いのであった。なにか速いメソッドがあるのかなぁ。