执行java方法所花费的时间是零?

执行java方法所花费的时间是零?,java,methods,time,Java,Methods,Time,我在调用方法之前和方法返回之后读取系统时间,并计算时间差,这将给出方法执行所需的时间 代码片段 long start = System.currentTimeMillis (); method (); long end = System.currentTimeMillis (); System.out.println ("Time taken for execution is " + (end - start)); 奇怪的是输出是0。这怎么可能呢?使用使用因为不到1毫秒 如果你想得到一个更有

我在调用方法之前和方法返回之后读取系统时间,并计算时间差,这将给出方法执行所需的时间

代码片段

long start = System.currentTimeMillis ();
method ();
long end = System.currentTimeMillis ();

System.out.println ("Time taken for execution is " + (end - start));

奇怪的是输出是
0
。这怎么可能呢?

使用使用因为不到1毫秒

如果你想得到一个更有意义的度量,我建议在循环中调用你的方法1000000次,计时,然后除以1000000


当然,即便如此,这也可能不具有代表性;缓存上的效果会有所不同,等等。

因为它花费的时间不到1毫秒

如果你想得到一个更有意义的度量,我建议在循环中调用你的方法1000000次,计时,然后除以1000000


当然,即便如此,这也可能不具有代表性;对缓存的影响会有所不同,等等。

很可能它所用的时间比相当粗粒度的系统时钟所用的时间要短。(例如,您可能会发现
System.currentTimeMillis()
仅每10或15毫秒更改一次。)

System.currentTimeMillis
有助于找出当前时间,但它的粒度不够细,无法测量较短的持续时间。相反,您应该使用使用高分辨率计时器的
nanoTime()
不适合查找当前时间,但它是为测量持续时间而设计的


可以把它看作是挂钟和秒表之间的区别。

很可能它所用的时间比相当粗粒度的系统时钟要短。(例如,您可能会发现
System.currentTimeMillis()
仅每10或15毫秒更改一次。)

System.currentTimeMillis
有助于找出当前时间,但它的粒度不够细,无法测量较短的持续时间。相反,您应该使用使用高分辨率计时器的
nanoTime()
不适合查找当前时间,但它是为测量持续时间而设计的



可以把它看作是挂钟和秒表之间的区别。

因为它的实际执行时间不到一毫秒?如果不是,你会使用什么样的OS和JDK组合来触发这样的结果?因为它实际上在不到一毫秒的时间内执行?如果没有,您使用的操作系统和JDK的哪种组合触发了这样的结果?“此方法提供纳秒精度,但不一定是纳秒精度”@sum请参见文档,此方法只能用于测量经过的时间,与任何其他系统或墙上时钟时间概念无关。返回的值表示从某个固定但任意的时间开始的纳秒(可能在将来,因此值可能是负数)。该方法提供纳秒精度,但不一定是纳秒精度。无法保证值的更改频率。由于数字溢出,连续通话的时间跨度超过大约292年(263纳秒)的差异将无法准确计算所用时间。Whow..不要告诉我,这是在你接听电话时发生的。;)你能将评论中的信息编辑到答案中吗?“此方法提供纳秒精度,但不一定是纳秒精度”@sum请参见文档,此方法只能用于测量经过的时间,与任何其他系统或挂钟时间概念无关。返回的值表示从某个固定但任意的时间开始的纳秒(可能在将来,因此值可能是负数)。该方法提供纳秒精度,但不一定是纳秒精度。无法保证值的更改频率。由于数字溢出,连续通话的时间跨度超过大约292年(263纳秒)的差异将无法准确计算所用时间。Whow..不要告诉我,这是在你接听电话时发生的。;)你能把你评论中的信息编辑成答案吗?@Jon Skeet-我刚才是你回答的吗?:哦,真不敢相信顶级用户回答了吗?。谢谢。:)@sum2000所以应该提供名为
的按钮,我觉得很幸运
:)即使是纳米时间也可能只有一微秒的准确度。此外,它本身是一个方法调用,在某些操作系统上可能需要惊人的长时间,即比您正在测试的方法的时间更长。解决这个问题的一个方法是反复调用该方法至少2秒钟,然后取平均值。@PeterLawrey:是的,如果可能的话,这当然更好,但在某些情况下,这是不合适的(特别是在真实的生产系统中测量时间时,你真的想要秒表而不是挂钟,但你不能人为地增加负载。)@Jon Skeet-我刚才是不是被你回答了……:哦,真不敢相信顶级用户回答了……。谢谢……)@sum2000应该提供一个名为“我觉得很幸运”的按钮,即使是nanoTime也可能只有一微秒的精确度。此外,它本身是一个方法调用,在某些操作系统上可能需要惊人的长时间,即比您正在测试的方法的时间更长。解决这个问题的一个方法是反复调用该方法至少2秒钟,然后取平均值。@PeterLawrey:是的,如果可能的话,这当然更好,但在某些情况下,这是不合适的(特别是在实际生产系统中测量时间时,你真的想要秒表而不是挂钟,但你不能人为地增加负载)。我使用
nanoSecond()
方法进行了检查。也感谢你的帮助。我使用
nanoSecond()
方法进行了检查。也感谢你的帮助。