【问题标题】:Duration discrepancy in Java [duplicate]Java中的持续时间差异[重复]
【发布时间】:2013-11-03 17:15:28
【问题描述】:

可能重复:
Java: how much time does an empty loop use?

看看以下内容:

for (int j = 0 ; j < 5 ; j++) {     
    long t1 = System.currentTimeMillis();
    for (int i = 0 ; i < 10000000 ; i++)
        ; // intentionally empty
    long t2 = System.currentTimeMillis();
    System.out.println (t2 - t1);
}

输出(多种可能之一):

2
11
0
0
0

如果你多次运行这个程序,你会发现输出的前两个数字总是非零,而所有其他数字确实是0。此外,第二个数字通常好像比第一个要高。即使我们循环更高,这似乎也成立,比如直到j &lt; 100有什么具体的原因吗?当然,一般来说毫秒可能不会有太大的不同,但我只是好奇。

【问题讨论】:

  • JVM 意识到你在 for 循环中没有做任何有用的事情并优化它
  • @nhahtdh 它是在运行时实现的?
  • 不确定这种情况,但它能够这样做,至少对于 switch case 语句。但很明显,对于这种情况,循环在某些时候被优化了。
  • 也许这是一个提示:stackoverflow.com/a/12061905/1012381

标签: java time


【解决方案1】:

第二个循环是空的,可以优化掉。由于 JVM 需要一些时间来实现这一事实,所以一开始并没有这样做。也许优化的时间是花在第二次运行上。

【讨论】:

    【解决方案2】:

    HotSpot JIT 执行几个优化循环 - 它首先将代码编译成半优化的机器版本,甚至只是解释它。然后它看到第二个循环实际上是一个热点,并使用更积极的优化重新编译代码。编译过程可能是性能的第二个高峰。然后它执行一个优化版本,它什么都不做,所以你得到全零。如果你用-server 运行代码,它可能会更早地编译代码,你会得到不同的结果。使用-Xint 运行它,以查看每次循环迭代的均匀性能。

    【讨论】:

      【解决方案3】:

      这会产生你想要的结果吗?

      long t1 = System.currentTimeMillis();
      for (int j = 0 ; j < 5 ; j++) {     
              for (int i = 0 ; i < 10000000 ; i++){}
              long t2 = System.currentTimeMillis();
              System.out.println(t2 - t1);
          }
      

      【讨论】:

      • 我希望 JVM 能够优化内部循环。
      猜你喜欢
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      • 2017-03-15
      • 2020-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      相关资源
      最近更新 更多