我知道System.nanoTime()
现在是测量时间超过System.currentTimeInMillis()
的首选方法。第一个明显的原因是nanoTime()给出了更精确的时序,另一个原因是我读到后者受到系统实时时钟调整的影响。 “受系统实时时钟影响”是什么意思?System.currenTimeInMillis()vs System.nanoTime()
回答
在这种情况下,我发现下面的博客文章摘录有用:
如果您有兴趣测量绝对时间然后一直使用
System.currentTimeMillis()
。要知道,它的分辨率可能相当 粗(虽然这是很少的绝对时间的问题。)如果您有兴趣测量/计算经过时间,然后 始终使用
System.nanoTime()
。在大多数系统上,它将提供微秒级的 分辨率。但请注意,此调用 也可能需要几微秒才能在某些平台上执行。
Clocks and Timers - General Overview大卫·霍姆斯
由于System.currentTimeMillis()
是依靠时间一天时钟系统,调整时间是合理的,以保持它的时间。
这是什么意思?以Linux为例说明CLOCK_REALTIME
:
测量真实(即挂钟)时间的系统时钟。 设置此时钟需要适当的权限。这个时钟是 在系统时间受到不连续的跳跃(例如,如果 系统管理员手动改变时钟),并且通过的adjtime(3)和NTP进行 增量调整。
这是来自您提供的链接“相对时间时钟由System.nanoTime()方法表示,它返回”自由运行“时间(以纳秒为单位)。”为什么它称为“自由运行”时间? – Geek 2012-07-21 10:41:26
@Geek我会说免费的,在*独立*的手段。绝对时间取决于操作系统触发的中断。相对*自由运行*时间与此无关,正如Joni Salonen指出的那样,由内部CPU时钟定时器产生。 – 2012-07-21 10:49:13
“系统通常同时具有绝对时钟(日时钟,低分辨率)和相对时钟(可计算”自由运行“时间的某种”高分辨率“计数器) 。为什么一天中的时钟分辨率较低,相对分辨率较高? – Geek 2012-07-21 11:00:26
只是检查的方法中的Javadoc:
System.nanoTime()
” ......这种方法只能用于测量经过时间和不相关的系统或任何其他概念墙上时钟时间...... “
System.currentTimeMillis()
” ......返回以毫秒为单位的当前时间。......”
因此,您可以看到在使用System.currentTimeMillis()
进行测量期间系统时间是否更改,您测量的时间间隔也会发生变化。但是,使用System.nanoTime()
方法测量间隔时,它不会改变。
这意味着System.currentTimeMillis()
返回的值是从机器的内部时钟获得的。如果系统管理员(或NTP)更改时间,例如,如果发现时钟快速运行5分钟并且系统管理员进行并更正它,则System.currentTimeMillis()
将受到影响。这意味着你甚至可以看到价值下降,如果你用它来衡量时间间隔,时间可以关闭。您甚至可以测量负数计时。
System.nanoTime()
另一方面返回从一些内部CPU计数器/时钟派生的值。这个时钟测量的时间不能被任何用户或程序改变。这意味着它将更加可靠的时机。但CPU时钟在关闭时重置,因此对于查找当前“挂钟”时间没有用处。
- 1. System.nanoTime问题()
- 2. System.nanoTime和System.currentTimeMillis的()
- 3. System.nanotime运行缓慢吗?
- 4. 同步“SensorEvent.timestamp”与“System.nanoTime()”或“SystemClock.elapsedRealtimeNanos()”
- 5. 为什么我的System.nanoTime()被破坏?
- 6. java - system.nanoTime()运行速度太慢
- 7. System.nanoTime应该如何保持一致? - Java
- 8. 为什么System.nanoTime()取4400纳秒
- 9. 是否System.nanoTime()跨线程一致?
- 10. 甲骨文等效于java的System.nanoTime()
- 11. System.nanoTime/System.currentTimeMillis的= 107(这应该是1E6?)
- 12. Thread.sleep()使用与System.nanoTime相同的时钟()
- 13. 使用System.nanoTime同步Java虚拟机
- 14. 在多线程代码System.nanoTime()产生很小的不准确性
- 15. Android:具有深度睡眠的时间间隔(System.nanoTime(),System.currentTimeMillis(),SystemClock.elapsedRealtimeNanos())
- 16. 如何使用System.nanoTime()更精确地排序事件
- 17. System.nanoTime()和其他与时间有关的类
- 18. vs vs 2008 vs vs 2010
- 19. Sorting arraylist with mergesort vs custom sort
- 20. Exec的VS ExecWait VS ExecShell VS nsExec :: Exec的VS nsExec :: ExecToLog VS nsExec :: ExecToStack VS ExecDos VS ExeCmd
- 21. CGL vs AGL vs OpenGL vs NSOpenGL vs CoreAnimation(CALayer)
- 22. VS VS VS VS 11中的MVC测试
- 23. MobileNet VS SqueezeNet VS ResNet50 VS启V3 VS VGG16
- 24. JPG vs Android上的WebP性能
- 25. NTOSKRNL.EXE VS NTKRNLMP.EXE VS NTKRNLPA.EXE VS NTKRPAMP.EXE
- 26. .NET vs ASP.NET vs CLR vs ASP
- 27. JRuby:import vs include vs java_import vs include_class
- 28. codendi vs redmine vs Retrospectiva vs trac
- 29. inline vs __inline vs __inline__ vs __forceinline?
- 30. VS 2008 vs VS 2008 Express
我很好奇。如果您尝试使用'currentTimeInMillis()'记录夏时制转换期间的经过时间,会发生什么?或者那不是什么意思? – 2012-07-21 09:37:54
什么'currentTimeMillis'试图衡量的是作为一种物理现象的时间流。 DST转变与您旅行时的时区变化类似:它只影响时间以小时和分钟表示;时间本身不受影响。 – Joni 2012-07-21 09:45:26
'currentTimeMillis'不受例如DST,但它受到例如不像'nanoTime'那样。 – 2012-07-21 10:20:08