Go的时间包声称提供了纳秒级的精度。 http://golang.org/src/pkg/time/time.go
我想知道它是如何实现的以及我是否可以信任它。我的疑问来自Python,该文件清楚地记录了它随时间变化的困难和局限性:
来自http://docs.python.org/2/library/time.html
各种实时函数的精度可能比表示其值或自变量的单位所建议的精度低。例如,在大多数Unix系统上,时钟每秒仅“滴答”一声50或100次。
另一方面,time()和sleep()的精度要优于Unix上的精度:时间以浮点数表示,time()返回可用的最准确时间(使用Unix gettimeofday()),以及sleep()将接受一个非零分数的时间(Unix select()用于实现这一点,如果有的话)。
由于操作系统给Python带来了如此艰巨的时间,因此Go如何实现其纳秒级精度?
至于实现,则time.Now()
回退到运行时中实现的功能。你可以查看C时间实现以及time·now
程序集的实现(在这种情况下为Linux amd64)。然后使用clock_gettime
,可提供纳秒级的分辨率。在Windows上,这是通过调用来实现的GetSystemTimeAsFileTime
,它也会生成纳秒(不是那么高的分辨率,而是纳秒)。
因此,是的,分辨率取决于操作系统,你不能指望它在每个OS上都是准确的,但是开发人员正在尽力使其达到最佳状态。例如,在go1.0.3,time·now
为FreeBSD使用gettimeofday
代替clock_gettime
,其中仅提供精确到毫秒。通过查看存储在其中的值可以看到AX
它,因为它是syscall id。如果看一下引用的程序集,可以看到ms值乘以1000得到十亿分之一秒。但是,现在已解决此问题。
如果希望确定,请在运行时源代码中检查相应的实现,并询问操作系统的手册。
support.microsoft.com/en-us/help/188768/…此文档指示GetSystemTimeAsFileTime以100纳秒的间隔(而不是纳秒)工作
@GeorgePolevoy当然,基础单位仍然是纳秒。时钟的分辨率为100 ns,因此它以100 ns的步长递增,使您可以以纳秒为单位进行计数,尽管不如单个纳秒那么精确。就像我在回答中说的那样。