在优化的情况下精确测量时间

时间:2013-02-17 19:40:25

标签: java optimization time

long start = System.nanoTime ();           // 1
//whatever operations                      // 2
long elapsed = System.nanoTime () - start; // 3

是否有可能将报表1和3混合在一起,以便我们无法准确测量时间?

--------------感谢所有反馈,让我们将代码更改为:

long start = System. currentTimeMillis ();           // 1
try { Thread.sleep (1000); } catch (Exception e) {}  // 2
long elapsed = System. currentTimeMillis () - start; // 3

并将问题更改为:1 2 3的执行是否可以重新排序为1 3 2? 如果是这样,我们如何衡量2需要多长时间?

1 个答案:

答案 0 :(得分:1)

即使您没有调用System.nanotTime(),JVM或CPU也不会重新排序这些指令,因为您在分配给start的表达式中使用elapsed。在任何情况下,System.nanoTime()都必然会生成本机系统调用,这会阻止重新排序。

那就是说,任何时候对这种测量都没有任何意义,我会期望在System.nanoTime()的调用之间的任何内容都包含至少几十万个指令,这样无论如何都不可能进行重新排序。 / p>

如果定时代码太短,任何计算机计时器的固有精度问题 - 包括某些操作系统提供的高分辨率计时器 - 都将无法产生可用的计时结果。