4

我正在使用 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:我的错误,我在方法中调用方法并总结了那些已经包含在内的时间。没有这些双倍,这一切都加起来了。感谢您清除此问题!

4

3 回答 3

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

不是吗?

那么对你来说有趣的是知道在这个不等式列表中什么是不正确的。这可能会给你一些见解。

于 2013-02-11T20:03:47.293 回答
1

我认为您的代码没有任何问题。在我的测试中,我从您的代码中得到了正确的经过时间。

这是我的输出:

方法 1:600 方法 2:500 方法 3:10 总时间:1110 构建成功(总时间:2 秒)

于 2013-02-11T19:00:25.483 回答
0

尝试将您的 doe 更改为以下内容:

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;

}
于 2013-02-11T20:30:16.713 回答