我在最后有一个非常长的字符串</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()
答案 0 :(得分:2)
两次运行之间的差异大约为微秒,这是预期的。您的计算机上发生了许多事情,这使得两次运行应用程序之间的执行环境从不相同。这就是你得到这种差异的原因。
编辑: Java API说:
此方法提供纳秒级精度,但不是必需 纳秒精度。
答案 1 :(得分:1)
很可能存在内存初始化问题或JVM启动时发生的其他事情,这会使您的数字出现偏差。您应该获得更大的样本以获得更准确的数字。玩弄订单,多次运行等等。
答案 2 :(得分:1)
您检查的方法很可能在幕后使用一些常用代码。但JIT只有在大约10.000次调用之后才能完成它的工作。因此,这可能是您前两个示例似乎总是较慢的原因。
快速修复:在第一次测量长enoug字符串之前,只需执行3次方法调用。