我有一些对 BitSet 执行按位运算的 Java 代码。我有一个操作列表,可以通过循环来“解释”它们,但对我来说重要的是我可以尽快执行这些操作,所以我一直在尝试动态生成代码来应用它们。我生成 Java 源代码来执行操作并使用 Javassist 编译实现这些操作的类。
不幸的是,我动态生成的代码比解释代码运行得慢。这似乎是因为 HotSpot 正在优化解释代码,但没有优化编译代码:在我运行它几千次之后,我的解释代码运行速度是最初的两倍,但我的编译代码显示没有加速。与这个假设一致,我的解释代码最初比编译代码慢,但最终更快。
我不确定为什么会这样。我的猜测是 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。