电视剧
system currenttimemillis(蒙圈了?System.currentTimeMillis()存在性能问题)
作者:LittleMagic来源:https://www.jianshu.com/p/d2039190b1cb

直接看代码

蒙圈了?System.currentTimeMillis()存在性能问题nerror="javascript:errorimg.call(this);">

蒙圈了?System.currentTimeMillis()存在性能问题nerror="javascript:errorimg.call(this);">

可见,并发调用System.currentTimeMillis()一百次,耗费的时间是单线程调用一百次的250倍。如果单线程的调用频次增加(比如达到每毫秒数次的地步),也会观察到类似的情况。实际上在极端情况下,System.currentTimeMillis()的耗时甚至会比创建一个简单的对象实例还要多,看官可以自行将上面线程中的语句换成new HashMap<>之类的试试看。

来到HotSpot源码的hotspot/src/os/linux/vm/os_linux.cpp文件中,有一个javaTimeMillis()方法,这就是System.currentTimeMillis()的native实现。

蒙圈了?System.currentTimeMillis()存在性能问题nerror="javascript:errorimg.call(this);">

HPET计时器性能较差的原因是会将所有对时间戳的请求串行执行。TSC计时器性能较好,因为有专用的寄存器来保存时间戳。缺点是可能不稳定,因为它是纯硬件的计时器,频率可变(与处理器的CLK信号有关)。关于HPET和TSC的细节可以参见https://en.wikipedia.org/wiki/HighPrecisionEventTimer与https://en.wikipedia.org/wiki/TimeStamp_Counter。

如何解决这个问题?

使用的时候,直接 CurrentTimeMillisClock.getInstance().now()就可以了。

不过,在System.currentTimeMillis()的效率没有影响程序整体的效率时,就完全没有必要做这种优化,这只是为极端情况准备的。


顶一下()     踩一下()

热门推荐

发表评论
0评