プログラミング言語の速度とアプリケーションの速度がいかに関係ないかがわかるグラフ

まずは次の表をご覧あれ。これはプログラミング言語ベンチマークとして有名な Computer Language Benchmarks Gameベンチマーク結果。上にいくほど高速で、下に行くほど遅い言語になる。

これを見れば、最速な言語は C/C++ であり、JavaHaskellOCaml といった静的な言語は軒並み上位に登場する。これに対し、RubyPythonPHP といったスクリプトは全部下のほう (つまり遅い)。その速度差は非常に大きく、このベンチマークで見ると Python3 や Ruby1.9C/C++ の約50倍から60倍遅く、Perl は約90倍、PHP にいたっては約130倍遅いことになる。
(ちなみに JIT つきの Lua が驚異的に高速なのが目をひく。この結果が本当だとしたら、言語の速度に大きく関係するのは動的か静的かではなく、どれだけ優秀な JIT を搭載しているかが大事ということがいえるかもしれない。)


   ・  ・  ・  ・  ・


さて、スクリプト言語は軒並みトロいということが分かったうえで、次のグラフをご覧頂きたい。これは各プログラミング言語でのテンプレートエンジンのベンチマーク結果である。約3年前の結果なのでバージョンは古めであるが、今でも参考にはなるはず。Test1 はテンプレートを毎回読み込むテストであり CGI 向け、Test2 はテンプレートを最初の1回だけ読んで使い回すテスト*1であり FastCGI や mod_xxx 向けである *2


(クリックで拡大)

これを見ると、Java や C で実装されたテンプレートエンジンが必ずしも最速ではないことが分かる。たとえば Velocity は Java の有名なテンプレートエンジンだが、実は性能は eRuby にすら劣ることがわかる*3。また C で実装された Cheetah や Template-Toolkit も、pure Python や pure Perl なテンプレートエンジンに思いっきり負けている。さらに、さきほどの言語別ベンチマークでいちばん遅かった PHP が、このベンチマークでは最速の地位にいる*4

またこのグラフには出てないが、JSP は Velocity より遅いことが分かっている。そもそも Java は静的であることが強みのはずなのに、Velocity にしろ JSP (EL) にしろ動的な言語を導入しているのだから理解に苦しむ。わざわざ Java の強みを捨ててまで、動作も遅くなるものを導入する必要があったのだろうか。あるいは <c:out/> のかわりに ${fn:escapeXml()} を使うとか、性能に無頓着すぎるだろ*5

Java のように高速な言語でも、Velocity や JSP のようなアーキテクチャではたいして速度は出せない。逆に RubyPHP のようにスクリプト言語の中でも遅いと言われるものでも、正しいアーキテクチャを採用すれば十分な速度は出せる。言語の速度を気にするのも結構だが、もっと重要な要素があるんだからそっちを気にしたほうがいい。


   ・  ・  ・  ・  ・


このように、プログラミング言語の速度とアプリケーションの速度は、必ずしも一致しない。一致しないどころか、まるで関係ないと言っても差し支えないぐらいである。もちろんテンプレートエンジンの速度でアプリケーションの速度を測れるわけではないが、「必ずしも一致しない」という結論は変わらない。

だから、たとえばPHP と Perl とをちまちま比較してもいいけど、その程度の差でどちらが速いかを結論づけても大して意味はない。それより「PHPPerl (や RubyPython) ではこの程度の差しかない」ことが認識できればそれでよく、あとは各自アプリケーションのチューニングにいそしむべきだろう。少なくも「PerlPHP より速いんです (キリッ」と言いながら Template-Toolkit を喜んで使っているやつや、「Java は速いんです (キリッ」と言いながら喜んで ${fn:escapeXml()} 使ってるやつは何も分かってないから、そんなやつらがいたらハナで笑ってよい。


今日のまとめ:プログラミング言語の速度 != アプリケーションの速度


なお複数の言語を使ったベンチマークでよさげなのがあれば紹介して下さい。ぐぐってみた限りでは他によさそうなのが見つからんかった。

*1:つまり Test2 であればディスク I/O の影響はほとんど受けない。ファイルキャッシュを考えると Test1 もほとんど影響をうけないと思われる。

*2:このベンチマークでは HTML エスケープはやってないが、HTML エスケープすると性能はだいたい半分に落ちると思えばよい。

*3:Velocity は 1.6 で速度がもう少し向上しているので、今なら eRuby に勝っているかもしれない。

*4:なおこのベンチマークでは Perl があまりぱっとしないが、Perl の潜在能力はこんなもんじゃないことを付け加えておきたい。

*5:${fn:escapeXml()}はELレベルでの関数呼び出しになるから、<c:out/>よりかなり遅い