ASM和Javassist之间*生成代码*的速度是否有差异?

ASM和Javassist之间*生成代码*的速度是否有差异?,java,javassist,Java,Javassist,我正在考虑为Java项目生成/修改运行时字节码 两个重要的API是ASM和Javassist,它们仍然保持不变 ASM是生成代码最快的,而且可能是最强大的。但它的用户友好性也远不如Javassist 在我的例子中,我希望预先执行字节码操作,以便在应用程序安装阶段结束时完成。因此,操作/生成的速度并不关键。关键是生成代码的速度,因为它将是实时桌面游戏的一部分,而不是典型的web应用程序,网络延迟完全掩盖了反射的成本 所以我的问题是,Javassist是否会在字节码中引入一些不必要的开销,而这些开销

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

两个重要的API是ASM和Javassist,它们仍然保持不变

ASM是生成代码最快的,而且可能是最强大的。但它的用户友好性也远不如Javassist

在我的例子中,我希望预先执行字节码操作,以便在应用程序安装阶段结束时完成。因此,操作/生成的速度并不关键。关键是生成代码的速度,因为它将是实时桌面游戏的一部分,而不是典型的web应用程序,网络延迟完全掩盖了反射的成本

所以我的问题是,Javassist是否会在字节码中引入一些不必要的开销,而这些开销在使用ASM时不会出现?或者,用另一种方式表示,与使用Javassist相比,在ASM级别工作是否会为生成的代码提供速度提升


[编辑]我对这两种工具的最新版本很感兴趣,最感兴趣的是看是否有人在同一个问题上尝试了这两种工具,并看到结果类的速度有任何显著差异。

我认为不可能提供一个简单客观的答案。这(我想)取决于各个工具的版本、生成的代码的性质,以及(最重要的)您是否在使用各个工具以及它们是否可以被使用

另外,你应该考虑的是,向下字节码操作路线是否可能给你足够的性能优势,以弥补软件开发和维护的痛苦。(除了你自己,任何人都无法回答……)


无论如何,我的建议是,如果您已经尝试过“纯Java”方法,并且发现它的性能令人无法接受,那么您只能选择这种方法。

+1一个“明智”的答案,即使它实际上没有回答这个问题。当然,我会使用这些工具的最新版本。代码将放在一个框架中,所以我只写了一次就忘了它。我的问题只能在运行时解决,因为它们涉及“运行时插件系统”,所以在编译时不能用Java代码解决。@SebastienDiot-你的最后一句话让我感到困惑。Java完全支持运行时“插件”(使用反射),无需借助字节码操作。您的问题有什么特别之处?我正在编写一个实时3D游戏,因此响应时间必须以毫秒为单位,并且我的域对象需要能够在运行时升级/降级时“更改类型”。这是可能的组合,但涉及大量的锅炉板,我想在运行时生成,因为游戏是基于插件的,插件是由玩家独立开发的。玩家从插件库中进行选择,我的框架必须在运行时将所选插件“合并”在一起,因为组合的总数将是指数级的,这会阻止在存储库中进行合并。好吧,不管你怎么说,我认为,在一个优化上花费大量精力是一个很大的风险,要么1)根本没有必要,要么2)没有帮助(因为你优化了错误的东西),要么3)可以通过纯Java仔细设计来完成。我建议先用纯Java实现。。。并使用评测来确定最需要优化的内容。然后决定怎么做。也许你更相信你的直觉,而不是剖析者。在你的情况下,我不会。我先做手动解决方案,但只有这样我才知道以后如何自动完成。问题是,不管怎样,我需要将不同插件绑定在一起的胶水代码,因为它们可能会扩展相同的对象。到目前为止,我发现的唯一完全通用的方法是每个字段和每个方法使用一个对象;这些实体成为两个映射。那太贵了。我花了几个星期寻找一些API;没有比这更细粒度的了。简言之,粘合代码绑定在编译时彼此不知道的代码,因此无法“手动”完成。请尝试这两种方法,并对结果进行微基准测试。另外,请记住,JIT可能会扭曲“效率较低”的字节码,使其在现实生活中更有效。@KevinWelker这有点像是说:“找到你自己问题的答案,然后告诉我们!”:D我提问的主要好处是,我不必同时学习它们!如果我想,那么我当然会做我自己的基准测试,而不是在这里提问。提问的前提是你在其他地方寻找答案,但找不到答案,或者你尝试了一些东西,但不理解你的结果。我看不到任何证据。建议您尝试的要点与我的另一点是一致的:没有正确的答案,因为JIT会使每个情况的结果有所不同,所以您必须尝试它,以知道哪个会更快。我确实在其他地方寻找过,但没有找到答案。我也不知道你怎么希望我能证明你,我在搜索,什么也没找到。假设我在没有证据的情况下没有搜索(比如在Google的前几页上出现了有用的结果),这是对IMO的侮辱。虽然我同意真正知道的唯一方法是自己尝试,但我希望至少有一周的时间用Javassist实现我的解决方案,两周的时间用ASM实现。我想我有理由在花3周的时间之前问别人是否有经验,这样我就可以比较我自己,而不是一个。对不起,你觉得被侮辱了——我可以理解,尽管这不是我的本意。我对JIT的技术解释是站着的,我看不出有什么办法。