我有一个非常长的字符串与模式</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网站的FAQ:
也在代码的不同点之间使用System.nanoTime()来执行运行时间测量应该总是准确的。
:
http://download.oracle.com/javase/1.5.0/docs/api/java/lang/System.html nanoTime ()
两次运行之间的差异以微秒为单位,这是意料之中的。在您的机器上发生的许多事情使得两次运行应用程序之间的执行环境永远不一样。这就是为什么你会有这种差异。
EDIT: Java API说:
该方法提供纳秒级精度,但不一定是纳秒精度 .
很可能是内存初始化问题或JVM启动时发生的其他事情使您的数字不正确。你应该取更大的样本来得到更准确的数字。调整顺序,多次运行,等等
您检查的方法很可能在幕后使用了一些通用代码。但是JIT只有在大约10,000次调用之后才能完成它的工作。因此,这可能就是为什么您的前两个示例似乎总是较慢的原因。
快速修复:只需在第一次测量足够长的字符串之前执行3个方法调用。