我有一些Java代码在BitSet上执行按位操作。我有一个操作列表,可以通过遍历它们来“解释”它们,但对我来说我可以尽快执行这些操作很重要,所以我一直试图动态生成代码来应用它们。我生成Java源代码来执行操作并编译一个使用Javassist实现这些操作的类。为什么生成的Java代码执行操作比“解释器循环”运行速度慢?
不幸的是,我的动态生成的代码运行速度比解释代码慢。看起来,这是因为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。
只是为了确认您正在讨论与多个方法调用相关的时间安排,但不*包括班级建设? – 2009-05-18 08:27:00
@mP - 是的,我只计算运行这个类所需的时间,不包括编译时间和内容。 – 2009-05-18 16:54:44