Vodafone fan! ぶろぐ様のベンチマークテストネタで書く、二つ目の記事です。
Sun Microsystems (Java の開発元、リンク先は日本法人)が、東芝と Sun Microsystems が共同作業を行い Vodafone 902T に 携帯電話向けに開発された CLDC HotSpot Implementation を搭載したと発表しました。
私は CLDC HotSpot Implementation にずっと期待していたので、この発表に舞い上がり、どんなベンチマークを走らせようかと考えました。でも、一時間ほど考えて、ベンチマーク専用プログラムでは意味がないことが CLDC HotSpot Implementation の良さなのだと考え直しました。
CLDC HotSpot Implementation の素晴らしいところは、Java のクラスファイルを CPU ネイティブコードにコンパイルし直して最適化まで行うことです。再コンパイルと最適化は一応は別の事柄で、ここでは先に最適化から書きます。
最適化とは、数学を駆使してプログラムの無駄を省く素晴らしい技術です。でも、センセーショナルに書けば、バグが出ない範囲でサボる技術です。
サボったらプログラムがおかしくなるじゃないかとおっしゃるでしょうが、数学を駆使するとバグの出ないサボり方が見つかっちゃうものなんです。二回計算していていつも結果が一緒なら一回しか計算しないとか、計算した結果が実はどこにも使われていないと分かれば最初から計算しないとか。すると計算回数そのものが減るんです。
例えて言うと、一億回計算させるベンチマークプログラムを作ったとして、他の携帯電話は正直に一億回計算するのに、Vodafone 902T は一億回計算していない可能性が大なんです。
次にネイティブコードへのコンパイルとは、Java プログラムのはずが携帯電話の中でネイティブプログラムに入れ替わっているという技術です。これは、プログラムの実行にかかる速度だけなら 10 倍にできます。
でも、数学を駆使してサボり方を見つけたり携帯電話の中でコンパイラを動かしたり、最適化のためには計算がいります。ということでサボろうとすると重くなるのでさじ加減が大事だったりします。携帯電話では簡単なサボり方を、PC では大掛かりなサボり方を、サーバではとんでもないサボり方を、します。
難しい話をすると、CLDC HotSpot Implementation では constant folding と constant propagation と loop peeling だけをしているそうです。私も folding と propagation の区別がついていない生兵法なのですが、先に書いた計算を繰り返さないぐらいの最適化はやるということです。
サーバだとどのくらいサボるかという話は HP (と書けばヒューレット・パッカード社!)が公開しているサーバ向け HotSpot VM の特徴を読むといいです。最後の例で「どうして同じ計算が途中から 2000 倍の速度になるんだ!?」と不思議に思われるでしょう。途中で「プログラムのこの部分は何度も繰り返されるからサボれないか考えよう」と調べ始め、実は計算結果が最初から決まっていることに気付いて思いきりすっ飛ばしてしまったんです。
だとすると、どんなプログラムなら性能を正確にかつ分かりやすくはかれるのか、私には分かりません。サボり方とコンパイルしてこうかがある箇所の組み合わせで、速度が結構変わりそうですから。でも、それは私の考えが浅いからでしょう。なぜなら...
Xengine4j については、逆に見直しました。ソースコードを 15 分読んで私にはボトルネックが分かりませんでしたし、結果が Sun Microsystems 社の宣伝文句に近いですし。宣伝文句に近いということは都合が良いことの裏返しでもあるのですが。
Sun Microsystems (Java の開発元、リンク先は日本法人)が、東芝と Sun Microsystems が共同作業を行い Vodafone 902T に 携帯電話向けに開発された CLDC HotSpot Implementation を搭載したと発表しました。
私は CLDC HotSpot Implementation にずっと期待していたので、この発表に舞い上がり、どんなベンチマークを走らせようかと考えました。でも、一時間ほど考えて、ベンチマーク専用プログラムでは意味がないことが CLDC HotSpot Implementation の良さなのだと考え直しました。
CLDC HotSpot Implementation の素晴らしいところは、Java のクラスファイルを CPU ネイティブコードにコンパイルし直して最適化まで行うことです。再コンパイルと最適化は一応は別の事柄で、ここでは先に最適化から書きます。
最適化とは、数学を駆使してプログラムの無駄を省く素晴らしい技術です。でも、センセーショナルに書けば、バグが出ない範囲でサボる技術です。
サボったらプログラムがおかしくなるじゃないかとおっしゃるでしょうが、数学を駆使するとバグの出ないサボり方が見つかっちゃうものなんです。二回計算していていつも結果が一緒なら一回しか計算しないとか、計算した結果が実はどこにも使われていないと分かれば最初から計算しないとか。すると計算回数そのものが減るんです。
例えて言うと、一億回計算させるベンチマークプログラムを作ったとして、他の携帯電話は正直に一億回計算するのに、Vodafone 902T は一億回計算していない可能性が大なんです。
次にネイティブコードへのコンパイルとは、Java プログラムのはずが携帯電話の中でネイティブプログラムに入れ替わっているという技術です。これは、プログラムの実行にかかる速度だけなら 10 倍にできます。
でも、数学を駆使してサボり方を見つけたり携帯電話の中でコンパイラを動かしたり、最適化のためには計算がいります。ということでサボろうとすると重くなるのでさじ加減が大事だったりします。携帯電話では簡単なサボり方を、PC では大掛かりなサボり方を、サーバではとんでもないサボり方を、します。
難しい話をすると、CLDC HotSpot Implementation では constant folding と constant propagation と loop peeling だけをしているそうです。私も folding と propagation の区別がついていない生兵法なのですが、先に書いた計算を繰り返さないぐらいの最適化はやるということです。
サーバだとどのくらいサボるかという話は HP (と書けばヒューレット・パッカード社!)が公開しているサーバ向け HotSpot VM の特徴を読むといいです。最後の例で「どうして同じ計算が途中から 2000 倍の速度になるんだ!?」と不思議に思われるでしょう。途中で「プログラムのこの部分は何度も繰り返されるからサボれないか考えよう」と調べ始め、実は計算結果が最初から決まっていることに気付いて思いきりすっ飛ばしてしまったんです。
だとすると、どんなプログラムなら性能を正確にかつ分かりやすくはかれるのか、私には分かりません。サボり方とコンパイルしてこうかがある箇所の組み合わせで、速度が結構変わりそうですから。でも、それは私の考えが浅いからでしょう。なぜなら...
Xengine4j については、逆に見直しました。ソースコードを 15 分読んで私にはボトルネックが分かりませんでしたし、結果が Sun Microsystems 社の宣伝文句に近いですし。宣伝文句に近いということは都合が良いことの裏返しでもあるのですが。