我正在使用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个字符)。
然后我对读取第一个文件时得到的String数组进行了大量的比较,并使用结果来计算一些概率。
EDIT2:我的错误,我在方法中调用方法,并总结了那些时间,已经包括在内。没有这些双倍,它们都会增加。谢谢你清理它!
答案 0 :(得分:5)
为了进一步研究这个问题,也许你可以打印出每种方法和全局过程的开始和结束时间。在这里,您只需打印每个时间和总时间,但您可以输出如下内容:
Global start : (result of System.nanoTime() here)
Method 1 Start : ...
Method 1 End : ....
Method 2 Start : ....
Method 2 End : ....
Method 3 Start : ....
Method 3 End : ....
Global end : ....
为什么我建议您这样做:您希望GlobalEnd - GlobalStart
大于或等于(End1-Start1) + (End2-Start2) + (End3-Start3)
。但这种关系实际上源于这样一个事实,即如果一切都是顺序的,则以下情况也适用:
GlobalStart <= Start1 <= End1 <= Start2 <= End2 <= Start3 <= End3 <= GlobalEnd
不是吗?
然后对你来说有趣的是要知道这个不等式列表中的不正确之处。这可能会给你一些见解。
答案 1 :(得分:1)
我发现您的代码没有任何问题。在我的测试中,我从你的代码中得到了正确的经过时间。
这是我的输出:
方法1:600 方法2:500 方法3:10 总时间:1110 建立成功(总时间:2秒)
答案 2 :(得分:0)
尝试将您的母鹿改为:
public static void main(String[] args)
{
long elaspeTime = 0;
elaspeTime += method1();
elaspeTime += method2();
elaspeTime += method3();
System.out.println("Total Time: " + elaspeTime / 1000000);
}
private static long method1()
{
long startTime = System.nanoTime();
//Do some work here...
System.out.println("Method 1: " + (System.nanoTime() - startTime) / 1000000);
return System.nanoTime() - startTime;
}