各種言語でベンチマーキング
やっぱり比較したくなるじゃない?
先日ベンチマークをしたけれど、ちゃんとやってみる。
方法について
- 変換対象のテキストは青空文庫にある芥川龍之介の「桃太郎」とする。
- 新仮名使いを歴史的仮名使いに変換させる処理にかかった時間を計測する(
time
コマンド)。 - キャッシュを効かせる言語もある(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 で実装できたのでテスト。動けばいいやという継ぎ接ぎだらけのプログラムだからか、ものすごく遅いのであった。なにか速いメソッドがあるのかなぁ。