【问题标题】:Conditional JIT-compilation条件 JIT 编译
【发布时间】:2010-09-10 18:29:58
【问题描述】:

在Java中我们可以像这样进行条件编译

private static final boolean DO_CHECK = false;

...

if (DO_CHECK) {
   // code here
}

编译器将看到 DO_CHECK 始终为 false 并删除整个 if 语句。但是,有时,尤其是在库代码中,我们不能使用条件编译,但我想知道,我们可以使用条件 JIT 编译吗?

 private final boolean doCheck;

 public LibraryClass(boolean d) {
    doCheck = d;
 }


 public void oftenCalledMethod() {
     if (doCheck) {
       ...
     }
 }

如果我们用 doCheck = false 构造 LibraryClass,JIT 编译器(在 Hotspot 中)是否也会删除 if 语句?

更新:我刚刚意识到 JIT 编译很可能不是在实例级别完成的,所以我认为这行不通,但也许有一种静态方式?

【问题讨论】:

  • 有人可能想知道这样做的实际好处是什么 - 如果该特定位没有被编译器 JIT 编辑或“优化”出来,那么系统资源的实际成本是多少?可执行文件大小在 Java 程序中那么重要吗?当 JITed 方法的一部分(如果这是一个正确的术语)时,内存使用量是否会飙升?

标签: java compiler-construction jvm jit jvm-hotspot


【解决方案1】:

JIT 代表“及时”。这意味着在虚拟机认为它需要它之前编译东西。因此,根据检查的原子性级别,您可能会发现永远不会运行的代码永远不会被 JIT 编译。

【讨论】:

  • if 中的代码不会被编译,但我想知道检查本身(可能很昂贵)是否被优化掉了。
  • 对布尔值进行比较?不太可能很贵。
猜你喜欢
  • 2013-09-04
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2010-10-06
  • 2011-07-17
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
相关资源
最近更新 更多