Lag*_*fer 2 java optimization jvm compiler-optimization
我正在阅读一篇博客文章并试图了解发生了什么。 这是博文。
它有这个代码:
if (validation().hasErrors())
throw new IllegalArgumentException(validation().errorMessage());
Run Code Online (Sandbox Code Playgroud)
在validation()方法中,我们有一些对象初始化和计算,所以假设这是一个昂贵的调用。难道要执行两次吗?或者编译器会优化成这样吗?
var validation = validation();
if (validation.hasErrors())
throw new IllegalArgumentException(validation.errorMessage());
Run Code Online (Sandbox Code Playgroud)
谢谢!
验证方法将被调用两次,并且每次都会执行相同的工作。首先,该方法比较大,因此不会被内联。如果没有内联,编译器不知道它做了什么。因此,它可以安全地假设该方法有副作用,因此它无法优化第二次调用。
即使该方法是内联的,并且编译器可以检查它,它也会发现实际上存在副作用。每次调用 LocalDate.now() 都会返回不同的结果。因此,您链接到的代码有缺陷,尽管在实践中不太可能遇到问题。
将验证结果捕获到局部变量中更安全,不是出于性能原因,而是出于稳定性原因。想象一下奇怪的情况,初始验证调用失败,但第二次调用通过。然后你会抛出一个没有消息的异常。