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需要多长时间?
答案 0 :(得分:1)
即使您没有调用System.nanotTime()
,JVM或CPU也不会重新排序这些指令,因为您在分配给start
的表达式中使用elapsed
。在任何情况下,System.nanoTime()
都必然会生成本机系统调用,这会阻止重新排序。
那就是说,任何时候对这种测量都没有任何意义,我会期望在System.nanoTime()
的调用之间的任何内容都包含至少几十万个指令,这样无论如何都不可能进行重新排序。 / p>
如果定时代码太短,任何计算机计时器的固有精度问题 - 包括某些操作系统提供的高分辨率计时器 - 都将无法产生可用的计时结果。