System.nanoTime()似乎坏了。想要检查代码效率的替代方法

时间:2016-03-18 13:32:20

标签: java time nanotime

由于我想检查几种方法(foo(int))以提高效率并将它们与整体运行时间进行比较,我最终编写了类似的内容:

void testNanoTime(){
    long methodDuration = 0;
    long testStart = System.nanoTime();
    for(int i= 0; i< 300; i++){

        long startJob = System.nanoTime();
        foo(i);  //checking how foo does with certain data.
        methodDuration+= System.nanoTime()-startJob;

        bar();
    }
    System.out.println("MethodDuration: "+methodDuration);
    System.out.println("TestDuration:   "+(System.nanoTime()-testStart));
}

foo(int)每次通话有时需要几分钟到半小时(但不能总计293年!)。现在的问题是,有时TestDuration(方法所用的整个时间)小于methodDuration,这对我来说似乎是不可能的。因此有两个问题:

  • 比较methodDurations仍然有效的旧版测试的数量是多少?
  • 我应该使用什么来进一步测试性能,而不会产生无效的timeStamps? System.currentTimeMillis()是安全的还是有同样的问题?

目前,测试是在linux系统上进行的。我已经在这里找到了一些关于这个问题的老问题和答案(例如Is System.nanoTime() completely useless?),但有些人说这是一个Windows问题,其他答案仍然不清楚,因为他们提到,他们可能已经过时了(他们甚至已经有几年了)。甚至大多数答案都相互矛盾!

1 个答案:

答案 0 :(得分:1)

基于JVM的工作方式,Java分析相当复杂。

以下是一些可帮助您入门的资源

有关纳米时间及其工作原理的详细信息,请阅读Nano Time Completely Useless

编辑:OP编辑后提及“纳米时间完全无用”,但保留在答案,因为恕我直言,它仍然相关。