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()用于实现这一点,如果有的话)。
来自 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,它也会生成纳秒(不是那么高的分辨率,而是纳秒)。
time.Now()
time·now
clock_gettime
GetSystemTimeAsFileTime
因此,是的,分辨率取决于操作系统,您不能指望它在每个OS上都是准确的,但是开发人员正在努力使其达到最佳状态。例如,在go1.0.3,time·now为FreeBSD 使用gettimeofday代替clock_gettime,其中仅提供精确到毫秒。通过查看存储在其中的值可以看到AX它,因为它是syscall id。如果看一下引用的程序集,可以看到ms值乘以1000得到十亿分之一秒。但是,此问题现已解决。
gettimeofday
AX
如果要确定,请在运行时源代码中检查相应的实现,并询问操作系统的手册。