なぜJavaコードは「インタプリタループ」よりもゆっくりと操作の実行を実行するために生成されたのでしょうか?

StackOverflow https://stackoverflow.com/questions/875695

質問

私はたBitSetにビット単位の操作を実行するいくつかのJavaコードを持っています。私は、操作のリストを持っており、それらをループすることによって、それらを「解釈」することができますが、それは私ができる限り迅速にこれらの操作を実行できるように私には重要ですので、私は動的にそれらを適用するためのコードを生成しようとしてきました。私が操作を実行し、Javassistのを使用してこれらの操作を実装するクラスをコンパイルするJavaソースを生成します。

残念ながら、私の動的に生成されたコードは、解釈コードよりも遅く実行されます。ホットスポットの解釈コードを最適化しているが、コンパイルされたコードを最適化されていないためであると表示されます。私はそれ数千回を実行した後、私の解釈のコードは、それが最初にやったの2倍の速さで実行されますが、私のコンパイルされたコードには高速化を示しません。この仮説と一致して、私の解釈コードがコンパイルされたコードよりも最初は遅いですが、最終的に速くなります。

私はなぜこれが起こっているかわかりません。私の推測では、多分Javassistのは、そのクラスのHotSpot触れないクラスローダを使用していることです。しかし、私は、Javaのクラスローディングの専門家ではないので、これは合理的な推測またはどのようにそれをテストして行くのであれば、私はよく分かりません。ここに私が作成し、Javassistの持つクラスをロードしています方法は次のとおりです。

ClassPool pool = ClassPool.getDefault();
CtClass tClass = pool.makeClass("foo");

// foo implements MyInterface, with one method
tClass.addInterface(pool.get(MyInterface.class.getName()));

// Get the source for the method and add it
CtMethod tMethod = CtNewMethod.make(getSource(), tClass);
tClass.addMethod(tMethod);

// finally, compile and load the class
return (MyInterface)tClass.toClass().newInstance();

誰もがここで何が起こっているかのようなアイデアを持っていますか?私は本当にあなたが与えることができるものは何でも助けいただければと思います。

私は、Windows XP 32ビットでSun 1.6サーバーのJVMを使用しています。

役に立ちましたか?

解決

コードはどこから来る

のHotSpotは気にしません。例えば、それは喜んでインラインコード異なるクラスローダによってロードされた実装と仮想メソッドの呼び出しによって呼び出されます。

私は、あなたがソースコード内で使用すると、このベンチマークのために実行しようとしている操作を書き込み、その後、ベンチマークすることを示唆しています。それはとにかくジェネレータを書くのではなく、生成されたコードの例を書き出すために、通常は簡単です。

ホットスポットのように硬いそれがかもしれないようにコードを最適化しない場合があります理由の存在数。例えば、非常に長い方法がインライン化されない傾向にあるか、それらにインラインメソッドを持つことになります。

他のヒント

私はここで何が起こっていたかを理解すると思います。私の最初のミスが長すぎたメソッドを生成していました。私はそれを固定した後、私は私の生成されたコードはまだ遅かったものの、それが最終的に解釈されたコードの速度に近づいていることに気づいています。

私はここの最大のスピードアップは、私のコードを最適化するのHotSpotから来ていると思います。解釈のバージョンでは、最適化するために、非常にわずかなコードがありますので、ホットスポットはすぐにそれの世話をします。生成されたバージョンでは、そこに最適化するために、多くのコードですので、ホットスポットは、すべてのコードの上にその魔法を動作するように時間がかかります。

私は十分な長さのための私のベンチマークを実行する場合は、

、私は今、解釈コードよりもわずかに優れて実行私の生成されたコードを参照してください。

CompileThreshold = 10000

-XXコンパイルする必要がありますどのくらいの速コードを制御するJVMの設定があります

  

コンパイル前のメソッド呼び出し/分岐数[-client:1500

これが役立つならば、あなたの例では、サイズが重要な役割を果たしているように見えるので、

私は、知りません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top