动态字节码 java_关于jvm:动态生成的Java字节码是否需要任何优化?

我使用ASM进行了一些Java字节代码生成。

通过以访客模式浏览某种小型DSL的AST。

而且我担心生成的字节码太"简单",也就是说,没有任何"编译时优化"。

尽管就我而言,如果未优化生成的字节码可以没问题,但我还是不禁要问:是否需要那些在运行时生成字节码的项目来进行字节码优化?

我知道对于jvm来说,大多数"优化"工作都是在程序运行时通过jit编译完成的。 因此,编译时的字节码优化可能影响不大。

但是,真的吗? 对动态生成的字节码进行字节码优化绝对没有意义吗? 是否有任何人可以分享一些有无优化形式的字节码之间的区别(主要是运行时性能)方面的经验?

您可以尝试对示例进行硬编码,并将其与字节码生成器竞争...

如果您的代码不是很频繁地运行,那么JIT不会对其进行优化,但这没关系,因为它并不经常运行。并且,如果它确实经常运行,它将得到优化。大家开心。

请查看此stackoverflow.com/a/1680212/655756。换句话说,您可以进行进一步的优化,但是没有必要,因为通常这些优化看起来更像是"美容"的。

@assylias是的,对,但是我真正关心的是,通过编译时间+ jit优化的字节码能否胜过仅通过jit优化的字节码?

@ n1ckolas啊..,我明白了,你的意思是说,是否进行优化不会有太大的不同。因为jit编译最终会使所有字节码非常有效,所以不管原始字节码有多详细。谢谢,proguard可能是一个很好的工具。

完全是@pf_miles,我不会说得更好了:)

运行生成的字节码是否有任何性能问题?我想不是。因此,问题是无关紧要的。

@Ingo不,我在运行简单的字节码时没有遇到任何性能问题。我只是好奇地问这个问题。

我知道至少有一种基于JVM的语言,它们的共享仍然是无名的,它的运行速度真是太慢了。它本可以使用一些编译时优化。

Javac和JVM在分析大致相同的编程模型,因此JVM也可以采用Javac可以采用的任何优化技术。这样,Javac复制工作就没有多大意义了。实际上,可能更希望Javac保留尽可能多的源代码结构,以便JVM可以更好地推理代码。

如果源语言不是Java语言,那将不适用。

考虑一下,CPU也做了很多很棒的优化,那么JVM为什么需要做任何优化呢?为什么不将其全部留给CPU。因为CPU和JVM正在分析非常不同的代码。 CPU正在分析任意顺序的机器指令(尽管它可以根据高级语言的常见行为做出假设)。 JVM正在分析一种非常特殊的高级语言,JVM可以基于CPU几乎不可能从机器指令中发现的知识来推理和转换代码。

回到您的情况,您(作为编译器)有可能对更高级别的源语言有更好的了解,因此您可以执行JVM无法实现的转换。

很好的解释! 我想我明白您的意思,这让我很清醒。 因此,如果我的DSL以某种形式的规则引擎引入了更高的编程模型-布尔逻辑,那么我可以对布尔逻辑理论进行一些优化,例如门逻辑优化。 但是,如果我的DSL与Java一样,只是另一种封装的命令式编程语言,则无需进行任何优化,对吗?

不,没有必要。

如果您查看Javac的输出,则实际上根本没有进行编译时优化。而且由于有了Hotspot的JIT,所以很难说出更改字节码对优化有何影响。除非您可以证明存在真正的瓶颈并有时间进行调查,否则最好不要担心这些事情。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值