[programming][mahjong] シャンテン数計算アルゴリズムで各言語をベンチマーク
ymatsuxさんのシャンテン数計算アルゴリズムをいろんな言語に移植して速度を比較してみました。
結果(所要時間):
- C++ (GCC 4.4.3): 2.07秒
- Java 1.6.0: 3.53秒
- C# (Mono 2.10.8): 3.57秒
- JavaScript (Node.js 0.10.18): 4.78秒
- Scala 2.9.1: 14.51秒
- Ruby 1.9.3: 250.65秒
タスクは天鳳牌譜中のランダムな手牌1000個のシャンテン数計算です。同一マシンのtimeコマンドで計測した3回の平均。
感想:
- V8かなり頑張ってる。C++の約2.4倍程度。
- Scala意外と遅い。JavaScriptに負けてる。
- Rubyめっちゃ遅い。こういうのを書く言語じゃないんでしょうけど。
注:
- Scalaの数字が前回と変わってるのは、Hayatoさんの勧めに従ってforをwhileに書き換えたのと-optimizeオプションを付けたことで合計2倍程度高速化したためです。
- もちろんこういうのはタスク依存でコードの書き方依存なので色々と一概には言えない。
- アルゴリズム自体は色々と改良の余地があると思っている。とりあえず3倍程度に高速化するアルゴリズムは実装済み。
- Java版以外は七対子を考慮してません。どの実装も国士無双を考慮していません。計測時はJava版に手を入れて七対子の計算を無効化してます。
というわけでJavaScriptが意外と速いので麻雀AI JavaScriptで書こうかなー。
牌は1m, 2m, ..., 9m, 1p, 2p, ..., 9p, 1s, 2s, ..., 9s, 東, 南, 西, 北, 白, 發, 中の順の0-originの通し番号で表現されています。
2013/9/21追記: yuizumiさんにC#版をもらったので追加。