1

我有一个很长的字符串,最后的模式</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 ()

4

3 回答 3

2

两次运行之间的差异是微秒级的,这是预期的。在你的机器上发生了很多事情,这使得你的应用程序的两次运行之间的执行环境永远不会相同。这就是为什么你会得到这种差异。

编辑: Java API 说:

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

于 2011-11-22T15:14:46.940 回答
1

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

于 2011-11-22T15:19:28.980 回答
1

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

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

于 2011-11-22T15:19:31.920 回答