Warm tip: This article is reproduced from serverfault.com, please click

其他-实际上,Go的时间有多精确?

(其他 - How precise is Go's time, really?)

发布于 2013-01-30 17:50:11

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如何实现其纳秒级精度?

Questioner
Niriel
Viewed
11
2017-05-23 18:33:55

至于实现,则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得到十亿分之一秒。但是,现在已解决此问题

如果希望确定,请在运行时源代码中检查相应的实现,并询问操作系统的手册。