由于我想检查几个方法(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编辑的帖子提到,"纳米时间完全无用",但将其保留在答案中,因为恕我直言,它仍然相关。