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

Java 在存在优化的情况下精确测量时间,java,optimization,time,Java,Optimization,Time,语句1和语句3是否可能混在一起,以致于我们无法精确地测量时间 --------------感谢所有反馈,让我们将代码更改为: long start = System.nanoTime (); // 1 //whatever operations // 2 long elapsed = System.nanoTime () - start; // 3 把问题改为:123的执行可以重新排序到132吗? 如果是这样,我们如何测量2需要多长

语句1和语句3是否可能混在一起,以致于我们无法精确地测量时间

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

long start = System.nanoTime ();           // 1
//whatever operations                      // 2
long elapsed = System.nanoTime () - start; // 3
把问题改为:123的执行可以重新排序到132吗?
如果是这样,我们如何测量2需要多长时间?

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

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


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

即使您没有调用
System.nanotime()
,JVM或CPU都不会对这些指令进行重新排序,因为您在分配给
appeased
的表达式中使用了
start
。在任何情况下,
System.nanoTime()
都会生成一个本机系统调用,这将阻止重新排序

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


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

你所说的“混叠在一起”到底是什么意思?最有可能的是,你所测量的操作根本不是“典型的“因为您没有使用结果,或者您没有在更大程序的上下文中运行它。因此,测量将毫无意义。此外,您也无法计算在nanoTime中花费的时间。对于任何应用程序来说,一纳秒都是很短的时间。如果您需要更高的精度,可能Java不是合适的平台。@petermm-但不能保证nanoTime返回纳秒精度。事实上,几乎可以保证不会发生这种情况。就“无序”操作而言,Java确实要求所有数据引用和操作副作用都按规定的顺序发生。但这并不要求实际的耗时、无副作用的操作按规定的顺序进行。你所说的“混叠在一起”到底是什么意思?最有可能的是,你所测量的操作根本不是“典型的”,因为你没有使用结果,或者你没有在更大的程序上下文中运行它。因此,测量将毫无意义。此外,您也无法计算在nanoTime中花费的时间。对于任何应用程序来说,一纳秒都是很短的时间。如果您需要更高的精度,可能Java不是合适的平台。@petermm-但不能保证nanoTime返回纳秒精度。事实上,几乎可以保证不会发生这种情况。就“无序”操作而言,Java确实要求所有数据引用和操作副作用都按规定的顺序发生。但这并不要求实际的耗时、无副作用的操作按规定的顺序进行。如果语句2与start无关,是否可能将1233重新排序为1232?如果是这样,我们如何测量2使用的时间?@user2081147:我的直觉和经验表明,1,2,3不能重新排序,因为
nanoTime()
是本机调用的副作用,但我在JLS中找不到实际的引用。您看到的是一个特定的问题,还是这个讨论是学术性的?呼叫不能重新排序。@HotLicks:1。我相信,如果没有副作用,内联Java方法调用基本上可以重新排序。2.我认为OP本质上是在询问
System.nanoTime()
是否起到屏障的作用。我相信它是…@thkala,我一直在优化一段代码,我看到如果语句2与start无关,那么可能将1233重新排序为1232?如果是这样,我们如何测量2使用的时间?@user2081147:我的直觉和经验表明,1,2,3不能重新排序,因为
nanoTime()
是本机调用的副作用,但我在JLS中找不到实际的引用。您看到的是一个特定的问题,还是这个讨论是学术性的?呼叫不能重新排序。@HotLicks:1。我相信,如果没有副作用,内联Java方法调用基本上可以重新排序。2.我认为OP本质上是在询问
System.nanoTime()
是否起到屏障的作用。我相信它是…@thkala,我一直在优化一段代码,我看到
long start = System. currentTimeMillis ();           // 1
try { Thread.sleep (1000); } catch (Exception e) {}  // 2
long elapsed = System. currentTimeMillis () - start; // 3