【问题标题】:Is it possible to disable JVM JIT loop optimisation是否可以禁用 JVM JIT 循环优化
【发布时间】:2018-06-25 17:50:43
【问题描述】:

我有非常简单的 scala 代码:

  def main(): Int = {
    var i: Int = 0
    var limit = 0

    while (limit < 1000000000) {
      i = inc(i)
      limit = limit + 1
    }
    i
  }

  def inc(i: Int): Int = i + 1

我正在使用 inc 方法上的 JVM JIT 方法内联。启用内联后,我得到了令人惊讶的 2s 与 4ns 示例——我想确保或至少验证的是,同时没有循环优化占用宫殿。我看了一下机器代码,似乎没问题

0x000000010b22a4d6: mov 0x8(%rbp),%r10d  ; implicit exception: dispatches to 0x000000010b22a529
0x000000010b22a4da: cmp $0xf8033d43,%r10d  ;   {metadata('IncWhile$')}
0x000000010b22a4e1: jne L0001  ;*iload_3
                               ; - IncWhile$::main@4 (line 7)
0x000000010b22a4e3: cmp $0x3b9aca00,%ebx
0x000000010b22a4e9: jge L0000  ;*if_icmpge
                               ; - IncWhile$::main@7 (line 7)
0x000000010b22a4eb: sub %ebx,%r14d
0x000000010b22a4ee: add $0x3b9aca00,%r14d  ;*iadd
                                           ; - IncWhile$::inc@2 (line 16)
                                           ; - IncWhile$::main@12 (line 9)
0x000000010b22a4f5: mov $0x3b9aca00,%ebx  ;*if_icmpge
                                          ; - IncWhile$::main@7 (line 7)
             L0000: mov $0xffffff65,%esi

我还检查了飞行记录器,没有发现任何可疑之处,但由于我不是普通用户,我想与更有经验的人再次确认。 代码可以找到on github

【问题讨论】:

  • 以“不明显确定的方式”计算值似乎应该防止任何形式的巧妙循环消除:while (limit &lt; 1000000000) { i = i ^ inc(i); ..}

标签: scala performance jvm performance-testing jit


【解决方案1】:

当然,循环已经过优化。没有常规 CPU 可以执行 在几纳秒内完成 10 亿次操作。

HotSpot 中有 许多 循环优化 - 您要禁用 所有 个吗?例如

-XX:LoopUnrollLimit=0
-XX:+UseCountedLoopSafepoints
-XX:-UseLoopPredicate
-XX:-PartialPeelLoop
-XX:-LoopUnswitching
-XX:-LoopLimitCheck

等等。要禁用大多数循环优化,请使用

-XX:LoopOptsCount=0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    相关资源
    最近更新 更多