首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >System.nanoTime怎么了?

System.nanoTime怎么了?
EN

Stack Overflow用户
提问于 2011-11-22 15:09:19
回答 3查看 1.5K关注 0票数 1

我有一个非常长的字符串与模式</value>在最末尾,我试图测试一些函数调用的性能,所以我做了下面的测试,试图找出答案.但我想我可能用错了nanoTime?因为不管我怎么换订单,结果都不合理.

代码语言:javascript
复制
  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);

我得到以下信息:

代码语言:javascript
复制
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()

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-22 15:14:46

两者之间的差异是微秒级的,这是预料中的。在您的机器上有许多事情正在发生,这使得应用程序的两次运行之间的执行环境是不一样的。所以你才会有这种区别。

编辑: Java说:

这种方法提供纳秒精度,但不一定是纳秒精度.

票数 2
EN

Stack Overflow用户

发布于 2011-11-22 15:19:28

最有可能的是,JVM启动时会出现内存初始化问题或其他问题,从而扭曲您的编号。你应该得到一个更大的样本,以获得更准确的数字。玩一玩命令,运行它多次,等等。

票数 1
EN

Stack Overflow用户

发布于 2011-11-22 15:19:31

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8229027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档