ASM和Javassist生成的代码速度有区别吗?

4

我正在考虑为一个Java项目进行运行时字节码生成/修改。

两个重要且仍在维护的API是ASM和Javassist。

ASM在生成代码方面最快,也可能是最强大的。但它比Javassist不太用户友好。

在我的情况下,我想要在应用程序设置阶段之前执行字节码操作,以便在结束时完成。因此,操作/生成速度并不关键。关键的是生成的代码速度,因为它将成为实时桌面游戏的一部分,而不是典型的Web应用程序,在其中网络延迟完全隐藏了反射的成本。

所以我的问题是,Javassist是否会在字节码中引入一些不必要的开销,而在使用ASM时不存在?或者,换句话说,与使用Javassist相比,使用ASM级别的工作是否会为我提供生成代码的速度提升?

[编辑] 我对这两个工具的最新版本感兴趣,并且主要想看看是否有人在同一个问题上尝试了它们两个,并且在生成的类的速度方面看到了任何显着差异。


1
尝试两者并进行微基准测试以比较结果。同时,请记住JIT可能会扭曲“效率较低”的字节码,使其在实际使用中更加高效。 - Kevin Welker
@KevinWelker 这有点像是说:“自己找到答案,然后告诉我们!” :D 我提问的主要好处是我不必学习它们两个!如果我想的话,当然我会做自己的基准测试,而不是在这里提问 - Sebastien Diot
SO提问的前提是你已经在其他地方寻找答案并且没有找到,或者你尝试过某些操作但不理解其结果。我看不到任何证据支持这一点。而建议你尝试的主要原因与我的另一个观点相符:由于JIT会根据个人情况使结果有所变化,因此没有正确答案,你必须亲自尝试才能知道哪个更快。 - Kevin Welker
我确实在其他地方寻找过,但没有找到答案。我也不知道你希望我如何证明我已经搜索过而没有找到任何东西。假设我没有搜索,没有证据(比如在前几页的谷歌搜索结果中出现有用的结果),这是令人感到侮辱的。虽然我同意真正了解它的唯一方法是自己尝试,但目前我预计至少需要一周的时间使用Javassist来实现我的解决方案,而使用ASM则需要两周。我认为在花费三个星期之前询问是否有其他人有经验是合理的,这样我就可以进行比较。 - Sebastien Diot
抱歉让你感到受辱 - 我能理解,尽管那不是我的意图。我对JIT的技术解释仍然有效,我看不出有其他解决方法。 - Kevin Welker
1个回答

2
我认为无法提供一个简单客观的答案。这取决于各自工具的版本、您正在生成的代码性质,以及最重要的是您是否已经充分使用了各自的工具。
另一件事情是,您应该考虑到是否采用字节码操作方法能够为您带来足够的性能优势,以弥补增加的软件开发和维护成本。(这个问题只有您自己才能回答...)
总之,如果您已经尝试过“纯Java”方法并发现其性能不足,则建议您使用字节码操作方法。

+1 一个“明智”的答案,即使它实际上并没有回答问题。当然,我会使用这些工具的最新版本。而且代码将放在一个框架中,所以我只需编写一次并忘记它。我的问题只能在运行时解决,因为它们涉及到一个“运行时插件系统”,所以无法通过Java代码在编译时解决。 - Sebastien Diot
@SebastienDiot - 我对你最后一句话感到困惑。Java支持运行时“插件”(使用反射)而无需诉诸字节码操作。你的问题有什么特别之处? - Stephen C
1
我正在编写一个实时3D游戏,所以响应时间必须在毫秒级别。我的领域对象需要能够在运行时“更改类型”,当它们被升级/降级时。这是通过组合实现的,但涉及大量样板文件,我希望在运行时生成,因为游戏是基于插件的,并且插件由玩家独立开发。玩家从插件存储库中选择,我的框架必须在运行时“合并”所选插件,因为组合总数将呈指数增长,防止在存储库中进行合并。 - Sebastien Diot
尽管你所说的,我认为存在一种重大风险,即你会在优化上花费巨大的精力,但要么不必要,要么无济于事(因为你正在优化错误的东西),或者可以通过纯Java中的仔细设计来完成。 我建议首先用纯Java实现...并使用分析工具确定最需要优化的内容。 然后决定该怎么做。也许你比分析工具更信任自己的直觉。在你的位置上,我不会这样做。 - Stephen C
1
我先手动解决问题,只是为了后面知道如何自动化。问题在于,无论如何,我都需要粘合代码将不同的插件绑定在一起,因为它们可能会增强相同的对象。到目前为止,我找到的唯一完全通用的方法是使用一个对象每个字段和每个方法;实体变成两个映射。那将会非常昂贵。我花了几周时间寻找一些API;没有像那样细粒度的东西。简而言之,粘合代码将在编译时互相不知道的代码绑定在一起,因此无法“手动”完成。 - Sebastien Diot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接