我有一个非常长的字符串与模式</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()
发布于 2011-11-22 15:14:46
两者之间的差异是微秒级的,这是预料中的。在您的机器上有许多事情正在发生,这使得应用程序的两次运行之间的执行环境是不一样的。所以你才会有这种区别。
编辑: Java说:
这种方法提供纳秒精度,但不一定是纳秒精度.
。
发布于 2011-11-22 15:19:28
最有可能的是,JVM启动时会出现内存初始化问题或其他问题,从而扭曲您的编号。你应该得到一个更大的样本,以获得更准确的数字。玩一玩命令,运行它多次,等等。
发布于 2011-11-22 15:19:31
您所检查的方法很可能在幕后使用一些常见代码。但是JIT只有在大约10.000次调用之后才能完成它的工作。因此,这可能是您的前两个示例看起来总是比较慢的原因。
快速修复:只需在第一次测量长enoug字符串之前执行3种方法调用即可。
https://stackoverflow.com/questions/8229027
复制相似问题