BitSetでビット単位の演算を実行するJavaコードがいくつかあります。操作のリストがあり、ループすることで「解釈」できますが、これらの操作をできるだけ早く実行できることが重要なので、動的にコードを生成して適用しようとしています。操作を実行するJavaソースを生成し、Javassistを使用してそれらの操作を実装するクラスをコンパイルします。
残念ながら、動的に生成されたコードは、解釈されたコードよりも実行が遅くなります。これは、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();
誰かがここで何が起こっているのかについて考えを持っていますか?私はあなたが与えることができるどんな助けにも本当に感謝します。
WindowsXP32ビットでSun1.6サーバーJVMを使用しています。