我使用以下代码来衡量程序的运行时间,
代码:
public static void main(String[] args) {
String a = "agtacgtcatacgtctagtactacgttca";
String b = "gtatccctagactsgtatcatacgtctat";
long startTime = System.nanoTime();
//This method call computes the Longest Common Sequence of the given 2 strings.
System.out.println(LCS.Linear.computeLCS(a, b));
long endTime = System.nanoTime();
System.out.println("Took "+(endTime - startTime) + " ns");
}
同一输入的示例输出:
运行1:
gtacctagctgtactacgtta
Took 1971471 ns
运行2:
gtacctagctgtactacgtta
Took 2242336 ns
为什么每次都有不同的运行时间?
如何查找该方法调用的实际运行时间?
答案 0 :(得分:9)
那些运行时间的大小为2毫秒!对于两次单独的运行,您不能指望它们是相同的。来自文档:
像这样的微观基准很难得到准确的数字。你有几个不确定性的来源:此方法提供纳秒精度,但不一定是纳秒精度。
仅举几例。您应该至少尝试运行算法10.000次左右并取平均值。
进一步阅读:
答案 1 :(得分:3)
难以可靠的测量时间。我认为这不是一个Java问题,但更多的问题是如何确保系统在执行代码时不执行任何操作。
我认为唯一真正的解决方案是更换措施,而是一系列测量和使用统计数据。您应该调查一些微基准测试框架。例如:
更糟糕的是,即使JVM本身的JIT优化也是不确定的,因此当您重新启动JVM并再次测量时,通常优化的代码本身会有所不同。
约书亚布洛赫有一个关于这个主题的精彩演讲:Performance Anxiety – on Performance Unpredictability, Its Measurement and Benchmarking(链接到slides)