System.nanoTime出了什么问题?

时间:2011-11-22 15:09:19

标签: java performance indexof nanotime

我在最后有一个非常长的字符串</value>,我试图测试一些函数调用的性能,所以我做了以下测试以试图找出答案...但我想我可能会错误地使用nanoTime?因为无论我如何交换订单,结果都没有意义......

  long start, end;

  start = System.nanoTime();
  StringUtils.indexOf(s, "</value>");
  end = System.nanoTime();
  System.out.println(end - start);

  start = System.nanoTime();
  s.indexOf("</value>");      
  end = System.nanoTime();
  System.out.println(end - start);

  start = System.nanoTime();
  sb.indexOf("</value>");
  end = System.nanoTime();
  System.out.println(end - start);

我得到以下内容:

163566    // StringUtils
395227    // String
30797     // StringBuilder

165619    // StringBuilder
359639    // String
32850     // StringUtils

无论我交换哪个订单,数字总会有些相同......这里的交易是什么?

来自java.sun.com网站的常见问题:

  

在代码中的各个点之间使用System.nanoTime()来执行经过时间的测量应始终准确。

此外:

  

http://download.oracle.com/javase/1.5.0/docs/api/java/lang/System.html#nanoTime()

3 个答案:

答案 0 :(得分:2)

两次运行之间的差异大约为微秒,这是预期的。您的计算机上发生了许多事情,这使得两次运行应用程序之间的执行环境从不相同。这就是你得到这种差异的原因。

编辑: Java API说:

  

此方法提供纳秒级精度,但不是必需   纳秒精度

答案 1 :(得分:1)

很可能存在内存初始化问题或JVM启动时发生的其他事情,这会使您的数字出现偏差。您应该获得更大的样本以获得更准确的数字。玩弄订单,多次运行等等。

答案 2 :(得分:1)

您检查的方法很可能在幕后使用一些常用代码。但JIT只有在大约10.000次调用之后才能完成它的工作。因此,这可能是您前两个示例似乎总是较慢的原因。

快速修复:在第一次测量长enoug字符串之前,只需执行3次方法调用。