System.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,这对我来说似乎是不可能的。因此有两个问题:

  • 比较方法持续时间的旧测试的金额仍然有效?
  • 我应该使用什么来进一步测试性能,而不会有获得无效时间戳的危险?去System.currentTimeMillis()安全还是有同样的问题?

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

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

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

  • Java Profiling (Stack Overflow)
  • Java 性能故障排除
  • 用户最好和最安全的Java分析器

有关纳米时间及其工作原理的详细信息,请阅读纳米时间完全无用

编辑

:OP编辑的帖子提到,"纳米时间完全无用",但将其保留在答案中,因为恕我直言,它仍然相关。

最新更新