java 小知识 - 纳秒
作者:京东物流 崔冬冬
一、System.nanoTime()
java 中,有这么一个方法 System.nanoTime() ,你用过吗?
二、与 System.currentTimeMillis()对比
System.currentTimeMillis()我们经常使用,可以参考对比一下
看方法意思,一个是纳秒,一个是毫秒,二者有关系吗?
先看看单位换算:一秒=1000 毫秒 1 毫秒=1000 微秒 1 微秒=1000 纳秒
那么 1 毫秒=1000000 纳秒,二者是不是这样的倍数关系?
带着疑问,我们本地打印测试一下
很显然,不是 1:1000000 的关系,具体是什么呢?
三,方法解释
看一下源码中的方法解释
Returns the current value of the running Java Virtual Machine's high-resolution time source, in nanoseconds. This method can only be used to measure elapsed time and is not related to any other notion of system or wall-clock time. The value returned represents nanoseconds since some fixed but arbitrary origin time (perhaps in the future, so values may be negative). The same origin is used by all invocations of this method in an instance of a Java virtual machine; other virtual machine instances are likely to use a different origin.
大概意思,该方法返回正在运行的 Java 虚拟机的高分辨率时间源的当前值,单位为纳秒。系统启动时间到现在经历的时间,与任何其他系统或挂钟时间概念无关。
四,使用场景
如此精度的时间,使用场景有哪些呢
1) 性能分析:常用于性能分析和优化,System.nanoTime()可以测量代码段的执行时间,帮助开发人员找出性能瓶颈并进行优化。
比如:一个简单的 for 循环,我们用 System.nanoTime()计时,可以见更精细的耗时。
2) 计时器:在需要精确计时的场景下,如计算程序执行时间、延迟等,System.nanoTime()可以提供更精确的时间信息,避免受系统时间调整的影响。
3) 并发控制:在多线程编程中,我们可能需要实现一些并发控制策略,如超时控制、任务调度等。可以用于获取时间戳,帮助实现这些并发控制策略。
4) 随机种子:Random 类构造函数中使用 System.nanoTime()作为种子值,提高随机性。具体可以看一下 Random 类。
五,简单总结
1)System.nanoTime()是高精度计数器,是相对时间。
2)jdk 源码中很多地方使用了 System.nanoTime(),我们可以学习参考。
3)小知识分享,不足之处欢迎大家指正,关于 java 里的知识点也欢迎大家讨论分享。
版权声明: 本文为 InfoQ 作者【京东科技开发者】的原创文章。
原文链接:【http://xie.infoq.cn/article/2481184bad3c20da968959178】。文章转载请联系作者。
评论