kなんとかの日記 このページをアンテナに追加

2010-04-30

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

| 08:51 |  プログラミング言語の速度とアプリケーションの速度がいかに関係ないかがわかるグラフを含むブックマーク

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

f:id:kwatch:20100429184937p:image

これを見れば、最速な言語は 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

f:id:kwatch:20100429185643p:image

(クリックで拡大)

これを見ると、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/>よりかなり遅い

apollo440apollo440 2010/04/30 12:18 ・・・えーっと、引き合いに出しているのはxx用テンプレートエンジンの速度(=作りかたの上手/下手)であって、xx言語の最大能力(=いわゆるベンチマーク)ではないのでは・・・。

apollo440apollo440 2010/04/30 12:21 ^あぁ、訂正。だからタイトルどおり、ってことですね。

anonymousanonymous 2010/04/30 13:41 二つ目のような物をみた気が…と思ったらこれでした。
Googleのリンクをそのままコピペしたので変なことになってます。

[PDF]An Example of Ruby Program Faster Than C 『言語の性能の違いが速度 ...
www.kuwata-lab.com/presen/rubykaigi2007.pdf

PsychsPsychs 2010/04/30 16:10 > これを見ると、Java や C で実装されたテンプレートエンジンが必ずしも最速ではないことが分かる。

いや、Tenjin は C で実装されているわけですが。このベンチマークから読み取れるのは、単に C で書かれている Tenjin が速いということだけでしょう。

通りすがり通りすがり 2010/04/30 18:08 javaに対する評価を多く記述されているようですが、javaでwebシステムを構築されたご経験がない方のようですね・・・
もしくは、テンプレートエンジンへのコーディングだけで完成できるような、非常に小規模なシステムしかご経験がないのでしょうか・・

一般的にjavaでwebシステムを構築する際には、JSPやVelocityなどのテンプレート上に全ての処理の記述なんてやりません。

複雑であったり、速度が要求される処理は全てクラス内で終わらせ、JSPでは計算結果のリスト等を表示するだけです。

つまり、高負荷な処理は全て静的なレイヤーで行ってしまうので、テンプレートエンジンの速さがうんたらと言われても、それがjavaの実行速度の全てと捉えてしまうのは判断が甘すぎます。

さらに通りすがりさらに通りすがり 2010/05/01 03:01 >一般的にjavaでwebシステムを構築する際には、JSPやVelocityなどのテンプレート上に全ての処理の記述なんてやりません。

だから言語の速度なんてのは関係ない。
いかに組上げるかって話じゃないの?
誰もそれが実行速度の全てって言ってないし。

ちゃんと文脈読み取ってから批判しようよ。

kwatchkwatch 2010/05/01 09:36 PsychsPsychs さん:
> いや、Tenjin は C で実装されているわけですが。

え?そんなことないはずですけど。もし C で実装されているなら、ぜひソースを紹介してください。


通りすがりさん:

> つまり、高負荷な処理は全て静的なレイヤーで行ってしまうので、テンプレートエンジンの速さがうんたらと言われても、それがjavaの実行速度の全てと捉えてしまうのは判断が甘すぎます。

エントリの主旨は「言語の速度 != アプリの速度」です。だれも『javaの実行速度の全て』とは言ってないんじゃないでしょうか。通りすがりさんがそう取り違えただけで。


さらに通りすがりさん:

> ちゃんと文脈読み取ってから批判しようよ。

主旨が伝わらないのはやはり書き手の技量の問題かなと思います。どなたか存じませんが、こちらの能力不足のせいでお手をわずらわせて申し訳ない。

blastydotblastydot 2010/05/01 13:10 >Template engine should use their host language directly unless there are some kind of reasons.

http://www.kuwata-lab.com/tenjin/pytenjin-faq.html#faq-why-so-fast

アセンブラかもしれんけど、まあ、Cかな。

元のベンチマークは13種類のプログラムを走らせて総合的に言語性能を導き出そうとしているのに対し、なぜかテンプレートエンジンを持ち出して、アプリケーション性能を語るのは不自然。
これだと言語なんか関係ないでしょ。

そもそも、元のベンチが多種の処理を持ち出して示しているのは、結局のところ、アプリケーション性能には言語性能は密接に関連しているということそのもの。

blastydotblastydot 2010/05/01 14:08 あと、趣旨は〜だといいながら、JSP批判で自己完結してるようにしか見えないのも不自然ではあるな。

通りすがり氏は趣旨を読み違えているというよりも隠しきれてない部分に突っ込んでるだけでは。

そもそも、DB周りで変なことしてるならともかく、ページ出力部分で神経なんか使ってられんでしょ。jk
ページ出力が命って言語からするとJSPとか馬鹿に見えるのはしかたないとは思う。
同様に、アプリの性能だといいながら、結局テンプレートとかページ出力部分にしか着目してないのは低次元だと思われてもしかたがない。

おっさんおっさん 2010/05/02 15:28 そもそも、2種類のベンチマークでどうこう言うなら、ハードウェアとOSくらい、同じ物で比較しないと意味ないんじゃないの?
乱暴すぎで、妄想だと言われてもしょうがない気がする。

kwatchkwatch 2010/05/13 18:26 > blastydot 2010/05/01 13:10
> >Template engine should use their host language directly unless there are some kind of reasons.
>
> http://www.kuwata-lab.com/tenjin/pytenjin-faq.html#faq-why-so-fast
>
> アセンブラかもしれんけど、まあ、Cかな。

えーと、これは何がいいたいのかな?まさかこれが「tenjinがCで実装されている理由」のつもりじゃないですよね。もしそうならバカすぎる。

> 元のベンチマークは13種類のプログラムを走らせて総合的に言語性能を導き出そうとしているのに対し、なぜかテンプレートエンジンを持ち出して、アプリケーション性能を語るのは不自然。
> これだと言語なんか関係ないでしょ。

はい?なんで『言語なんか関係ない』の?

> そもそも、元のベンチが多種の処理を持ち出して示しているのは、結局のところ、アプリケーション性能には言語性能は密接に関連しているということそのもの。

元のベンチって、shootoutのことですよね。ちゃんとベンチみました?フィボナッチとかN体問題とかCPU boundなものに偏っていて、世間一般で使われる業務アプリやらWebアプリとはかけ離れてますよ。

> blastydot 2010/05/01 14:08
> あと、趣旨は〜だといいながら、JSP批判で自己完結してるようにしか見えないのも不自然ではあるな。
>
> 通りすがり氏は趣旨を読み違えているというよりも隠しきれてない部分に突っ込んでるだけでは。

『隠しきれない部分』!これは流行る!

> そもそも、DB周りで変なことしてるならともかく、ページ出力部分で神経なんか使ってられんでしょ。jk

神経使う必要ないでしょ、どのテンプレートエンジンでも。方向がずれた反論はバカさ加減が目立つだけだからやめたほうがいいと思う。

> ページ出力が命って言語からするとJSPとか馬鹿に見えるのはしかたないとは思う。

関係ねーーー!

> 同様に、アプリの性能だといいながら、結局テンプレートとかページ出力部分にしか着目してないのは低次元だと思われてもしかたがない。

アプリの性能はキャッシュやネットワークが加味されて言語速度の要素が薄まるので、『言語の速さ!=アプリの速さ』を裏付けるなら、キャッシュもネットワークも入らないベンチのほうがいいでしょ。


> おっさん 2010/05/02 15:28
> そもそも、2種類のベンチマークでどうこう言うなら、ハードウェアとOSくらい、同じ物で比較しないと意味ないんじゃないの?
> 乱暴すぎで、妄想だと言われてもしょうがない気がする。

なんでやねん。shootoutのベンチマークとテンプレートエンジンのそれとは別個に評価してるんだから、ハードもOSも別でいいじゃん。

にこっにこっ 2012/12/14 10:47 たぶん、エントリーの投稿者は誰も返信しないのを見て勝ち誇った顔をしているのでしょうけど、
少し深い知識を持った人なら呆れた顔で見ているでしょうね。

具体的な反論になって無いなどと言い出すのでしょうけど、
もう少し柔軟な頭を持つようにしましょう。

頑張って下さいね。

あかさあかさ 2013/03/17 10:08 お前らと下は頭悪すぎるゴミ屑以下だな。

名無し名無し 2013/09/11 00:12 簡単なことをまわりくどく書いているから誤解をされているんだろうね。。。