Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在几个方法调用中使用System.nanoTime()的已用时间比每个方法中的已用时间之和提供的值低?_Java - Fatal编程技术网

Java 在几个方法调用中使用System.nanoTime()的已用时间比每个方法中的已用时间之和提供的值低?

Java 在几个方法调用中使用System.nanoTime()的已用时间比每个方法中的已用时间之和提供的值低?,java,Java,我使用System.nanoTime()来测量调用几个方法所需的时间。 在每种方法中,我都用同样的方法来衡量每种方法所需的时间。 最后,经过的时间之和应该小于总经过的时间,或者我是这么认为的。然而,事实并非如此 例如: public static void main(String[] args){ long startTime = System.nanoTime(); method1(); method2(); method3(); System.out.println( "

我使用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
在我的例子中,总时间约为950ms,但每次经过的时间总和为1300ms+。为什么会这样

编辑:

好的,说得更清楚一点,我在多次写入数组时(我只是做了一个测试)并没有出现这种行为。当我这样做时,我得到了非常精确的结果(+-1ms)

我实际上是这样做的:

我将两个相当大的文本文件读入字符串数组(第一个文件为1000*~2000个字符,第二个文件为200*~100个字符)

然后,我对读取第一个文件得到的字符串数组进行了大量比较,并使用结果计算了一些概率


EDIT2:错误就我而言,我在方法中调用方法,并总结了这些时间,这些时间已经包括在内。如果没有这两倍,一切都会累加起来。谢谢你把这件事弄清楚

我看你的代码没有问题。在我的测试中,我从您的代码中获得了正确的运行时间

以下是我的输出:

方法1:600 方法2:500 方法3:10 总时间:1110
BUILD SUCCESSFUL(总时间:2秒)

要进一步调查这件事,也许您可以打印出每个方法和全局过程的开始和结束时间。在这里,您只需打印每个人花费的时间和总时间,但您可以输出如下内容:

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     : ....
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;

}
我建议您这样做的原因如下:您希望
GlobalEnd-GlobalStart
大于或等于
(End1-Start1)+(End2-Start2)+(End3-Start3)
。但这种关系实际上源自这样一个事实,即如果所有事情都是连续的,那么以下情况成立:

GlobalStart <= Start1 <= End1 <= Start2 <= End2 <= Start3 <= End3 <= GlobalEnd

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

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     : ....
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;

}

他们都在同一条线上吗?都在同一条线上,是的。尝试不除法,求和=128182306总计=953483065,所以不,这不是舍入错误。为了得到更好的答案,你应该尝试创建一个再现这种行为的最小示例。这将帮助人们更好地评估问题可能是什么。JVM可以对涉及System.nanoTime的代码重新排序多少?这种症状可以通过以相反的顺序执行两个nanoTime调用来解释,这样一小部分时间会被计数两次。您实际上是有三个方法调用,还是有很多方法调用?因为对许多小的数字求和会累积很多错误。当只对数组进行大量写入时,我会得到精确的结果(减少1ms)。在我的实际项目中,我将两个文件读入字符串,对这些字符串进行大量比较,并计算一些内容。我现在最好的猜测是,由于我是在多核CPU上运行它,这就是造成时间混乱的原因(从某个地方可以看出,nanoTime()在多核上可能会出错)。运行:主方法开始:30495884497522方法1开始:30495885305501方法1结束:3049619992982方法1开始:30496199980102方法1结束:30496200498200方法3开始:3049620164783方法2开始:30496201601997方法2结束:30496264901276方法3结束:30496637264023方法5开始:30496637324414方法4开始:30496637348253方法4结束:30497332544531方法5结束:30497364712059主要方法结束:30497376773253构建成功(总时间:2秒)耶稣,你真的不能格式化这些评论吗?感谢你给出结果。显然,方法2和3是同时运行的(也就是说,一个在前一个还没有完成时启动),方法4和5也是。这些方法都在做什么?顺便说一句,告诉我,你不是从方法3调用方法2,从方法5调用方法4,不是吗?事实上,我是。方法3调用2,5调用4。这就是为什么开始时间和结束时间适合(?)并且将经过的时间加在1、2、3、4和5中??从3调用2时,2中的已用时间包括在方法3的已用时间中。因此,它们不能相加。如果你想得到有意义的结果,你可以在1,3和5中求和。