BitSetでビット単位の操作を実行するJavaコードがあります。私は操作のリストを持っていて、それらをループして解釈することができますが、できるだけ早くこれらの操作を実行できることが重要です。そのため、コードを動的に生成して適用しています。私は操作を実行するJavaソースを生成し、Javassistを使用してこれらの操作を実装するクラスをコンパイルします。オペレーションを実行するために生成されたJavaコードが「インタプリタループ」より遅く実行されるのはなぜですか?
残念ながら、私の動的に生成されたコードは、解釈されたコードよりも遅く実行されます。これは、HotSpotが解釈済みコードを最適化しているが、コンパイル済みコードを最適化していないためです。数千回実行した後、私の解釈済みコードは最初の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を使用しています。
多くのメソッド呼び出しに関連するタイミングについては、クラスのビルディングを含めて* NOT *であることを確認していますか? –
@mP - はい、私は、このクラスを実行するのにかかる時間を計時しています。コンパイル時間とその他は含みません。 –