【问题标题】:Java JIT compiler optimisation for ternary operator三元运算符的 Java JIT 编译器优化
【发布时间】:2019-09-07 13:52:26
【问题描述】:

使用三元运算符时,写类似

的代码很方便
String name = employee.getName() != null ? employee.getName() : "";

比(大多数时候)更有效的代码,如

String name = employee.getName();
if (name == null) {
    name = "";
}

Q1.我很想知道 JIT 编译器如何优化此代码。

在尝试通过互联网寻找答案时,尽管我找到了一些参考资料,但它们并未涵盖此特定案例。

即使得到答案我也很高兴

Q2. 找出 JIT 编译器优化的最简单方法。 (eclipse的一些插件工具。)

【问题讨论】:

  • 即时 (JIT) 编译器适用于字节码,而不是源代码,并且是 Java VM 的一部分(例如 HotSpot 或 OpenJ9)。即使是javac 或Eclipse 编译器从源代码创建的字节码也可能由于不同的优化而不同。你能说一下你的意思是哪个编译器吗?
  • 您可以告诉 VM 记录任何 jit:ing 并自己查看。请注意,无法保证其实现方式不会随着时间而改变。有关更多信息,请参见此处:oracle.com/technetwork/articles/java/…
  • 顺便说一句,在第一个代码中,sn-p name 是一个有效的最终变量,但在第二个sn-p 中不是。

标签: java eclipse ternary-operator jit


【解决方案1】:

我将给出臭名昭著的 Stack Overflow 答案:“错误的方法,做其他事情”。

为什么不这样做

你想在这里做的事情,这就是所谓的微基准测试。 Brian Goetz 写了一个 long post 为什么这通常是一个坏主意。以下是一些亮点:

  • 优化也取决于您的操作系统和硬件
  • 对于大多数应用程序来说,这种加速并不重要
  • 只衡量你感兴趣的东西真的很难

该怎么做

您可以衡量您的应用程序。您可以使用 visualvm 之类的工具找到应用程序中的瓶颈。然后你可以优化那部分。优化通常是有创意的,例如使用缓存,或仅扩展系统的特定部分。

但你真的想做微基准测试

在这种情况下,您可以做以下两件事:

  • 读取字节码并尝试猜测在您的设置中哪个会更快(操作系统 + 硬件)
  • 使用java中引入的microbenchmark框架。这会给你一些数字。这些数字仍将是特定于设置的,与您的应用程序无关。但是,测量部分将是准确的。

【讨论】:

    猜你喜欢
    • 2013-05-17
    • 2019-06-27
    • 1970-01-01
    • 2015-09-03
    • 2013-02-26
    • 2010-09-21
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多