Java中的System.nanoTime()为相同的输入提供不同的运行时间

时间:2015-03-04 19:31:28

标签: java

我使用以下代码来衡量程序的运行时间,

代码:

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

为什么每次都有不同的运行时间?

如何查找该方法调用的实际运行时间?

2 个答案:

答案 0 :(得分:9)

那些运行时间的大小为2毫秒!对于两次单独的运行,您不能指望它们是相同的。来自文档:

  

此方法提供纳秒精度,但不一定是纳秒精度

像这样的微观基准很难得到准确的数字。你有几个不确定性的来源:

  • 计算机上的其他进程
  • JVM热身
  • JIT编译
  • 垃圾收集

仅举几例。您应该至少尝试运行算法10.000次左右并取平均值。

进一步阅读:

答案 1 :(得分:3)

难以可靠的测量时间。我认为这不是一个Java问题,但更多的问题是如何确保系统在执行代码时不执行任何操作。

我认为唯一真正的解决方案是更换措施,而是一系列测量和使用统计数据。您应该调查一些微基准测试框架。例如:

更糟糕的是,即使JVM本身的JIT优化也是不确定的,因此当您重新启动JVM并再次测量时,通常优化的代码本身会有所不同。

约书亚布洛赫有一个关于这个主题的精彩演讲:Performance Anxiety – on Performance Unpredictability, Its Measurement and Benchmarking(链接到slides