1
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 需要多长时间?

4

1 回答 1

1

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

也就是说,对于任何有意义的时间测量,我希望调用之间的任何内容都System.nanoTime()至少包含数十万条指令,因此无论如何重新排序都是不可能的。

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

于 2013-02-17T19:47:16.993 回答