なぜRubyをPythonよりもPHPよりも高速化できたか

最も有名なベンチマークサイト "The Computer Language Benchmarks Game" における最新のランキングで
Ruby 1.9 は Python3, PHP, JRuby を追い抜きスクリプト言語としてトップクラスの値を叩き出しました。

5/4の時点では最下位に近かったので大きく前進しています。


1つのパッチで520%の高速化を達成

この高速化は私がfastaというベンチマークのプログラムを改善したことにより実現しました。


少し前Rubyのベンチマークを書くことにハマっていました。

他の人のプログラムや統計を眺めていたとき、fastaに関してPythonが異常に速いことに気づきました。
他のスクリプト言語のおよそ50倍速く、アルゴリズムが改良されていました。

fasta #6
fasta #7

この2つのコードを比較するとわかるのですが、処理が重複している箇所について事前にテーブルを作成しています。


このアルゴリズムをRubyにportしたところRubyでもPythonとほぼ同様のスピードになりました。

Perlに負けた理由

最初のスクリーンショットではPerlには負けてしまっています。これはPerlでは同様のアルゴリズムの改善を行ったプログラムが6/9に投稿されて、
これと私のRubyのものの2つのプログラムが今日(7/12)に取り込まれたためです。

スコアを向上させる方法

"The Computer Language Benchmarks Game" では

  1. 各ベンチマークで最速の言語(たいていはC++)の何倍のスピードがかかったかを算出
  2. その中央値を算出

という方法で言語(処理系)のスコアを求めています。


例えば現在の Ruby 1.9 のスコアは36.77ですので
Ruby 1.9 v.s C++ GNU g++

ここをみて35付近を基準に高速化する必要があります。

まずfasta, regex-dna, pidigits, reverse-complement, binary-treesは中央値よりも値が小さいのでこれ以上高速化しても意味がありません。


ベンチマーク数は10なのでスコアは中間に近い
(binary-trees + k-nucleotide) / 2 = 35.5
で求められます。従ってこの2つは少しでも高速化すればスコアの改善に直結します。


より最速より遅いspectral-norm, n-body, fannkuch-redux, mandelbrotはk-nucleotideの50よりもさらに小さな値にできない限り高速化しても意味がありません。

このようにスコアの算出方法を考慮することで効率的にランキングを上昇させることができます。

まとめ、あるいはなぜベンチマークのスコアが実際の速度とあまり関係がないのか

  • だから実際の言語の速度とはあまり関係がないこともよくあるんです!