【发布时间】:2013-02-11 18:44:20
【问题描述】:
我正在使用 System.nanoTime() 来测量调用多个方法所需的时间。 在每种方法中,我都会做同样的事情来衡量每种方法需要多长时间。 最后经过时间的总和应该小于总经过时间,或者我认为。然而,事实并非如此。
例子:
public static void main(String[] args){
long startTime = System.nanoTime();
method1();
method2();
method3();
System.out.println( "Total Time: " + (System.nanoTime() - startTime) / 1000000);
}
private void method1(){
long startTime = System.nanoTime();
//Stuff
System.out.println( "Method 1: " + (System.nanoTime() - startTime) / 1000000);
}
// same for all other methods
在我的情况下,总时间约为 950 毫秒,但每个经过时间的总和为 1300 毫秒以上。这是为什么呢?
编辑:
好吧,说得更清楚一点,我在多次写入数组时(我只是在测试中这样做)时没有得到这种行为。当我这样做时,我得到了非常精确的结果(+-1ms)。
我实际上在做的是这样的:
我将两个相当大的文本文件读入字符串数组(第一个文件中 1000 * ~2000 个字符,第二个文件中 200 * ~100 个字符)。
然后我对读取第一个文件得到的字符串数组进行大量比较,并使用结果来计算一些概率。
EDIT2:我的错误,我在方法中调用方法并总结了那些时间,这些时间已经包含在内。没有这些双倍,这一切都加起来了。感谢您解决这个问题!
【问题讨论】:
-
他们都在同一个线程吗?
-
都在同一个线程中,是的。尝试不除法,Sum = 1 280 182 306 Total = 953 483 065,所以不,这不是舍入错误。
-
为了获得更好的答案,您应该尝试创建一个重现该行为的最小示例。这将帮助人们更好地评估问题所在。
-
JVM可以对涉及System.nanoTime的代码重新排序多少?可以通过以相反的顺序执行两个 nanoTime 调用来解释该症状,以便将一小段时间计算两次。
-
您确实有三个方法调用需要求和,还是很多?因为将许多小数字相加会累积很多错误。
标签: java