【发布时间】:2018-02-13 01:17:31
【问题描述】:
最近,我阅读了 here 关于 JVM 优化的文章,这很棒,
但我有一个优化问题,即 Null Check Elimination(或 Uncommon 陷阱)
总结 Null Check Elimination 删除 if (obj == null) ... 并希望最好,而如果遇到 Segmentation Fault 它会重新编译代码,这次包括被忽略的代码if (obj == null) ....
我的问题是,鉴于:
bool foo(MyClass obj)
{
if(obj == null)
return false;
m_someVar++;
obj.doSomething(m_someVar);
}
因为 Null-Check 已被消除,并且仅在 m_someVar++ 之后才需要。
foo 会在 c 为空时多执行一次 m_someVar++ 吗?
编辑:
是否有一些资源可以更深入地解释这种优化的实现,解释这种优化如何使代码在语义上保持一致?
谢谢
【问题讨论】:
-
你测试过会发生什么吗?
-
还有其他一些优化,例如更改 if-then-else 订单等,可能会产生与您描述的效果类似的效果,所以我认为这已经涵盖(虽然没有测试过)。正如 Carcigenicate 建议的那样,进行测试并自己找出答案。
-
您可以确定,Java HotSpot JIT 编译器所做的所有优化都不会影响语言语义。因此,在您的情况下,它可能不会应用 Null-Check Elimination,或将
++延迟到修改后的obj.doSomething(m_someVar+1)或在分段错误后执行m_someVar--。 -
是的,它似乎在汇编程序级别执行了两次命令。但它不会破坏最终结果(否则将是不正确的 JVM 实现)。看看这篇文章jcdav.is/2015/10/06/SIGSEGV-as-control-flow这家伙逐行分析C2输出的情况完全一样。
-
@RalfKleberhoff 谢谢,我很确定它会,但不知道 JVM 如何知道“中间代码”何时对运行两次无动于衷。是否有一些来源可以对实现进行更深入的解释?
标签: java optimization jvm null-check