猿问

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

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


慕盖茨4494581
浏览 259回答 3
3回答

吃鸡游戏

至于实现,则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 以获得纳秒。但是,现在已解决此问题。如果希望确定,请在运行时源代码中检查相应的实现,并询问操作系统的手册。

凤凰求蛊

Python的time.time函数的问题之一是它返回float。浮点数是具有53位精度的IEEE 754双精度数字。由于现在距1970-01-01(纪元)已超过2 ** 30秒,因此您需要61(31 + 30)位精度来存储自1970-01-01以来的纳秒级时间。不幸的是,这比python浮动存储的内容少了7或8位,这意味着python浮动总是不如go时间精确。为了量化下面的演示,仅是由于float类型的限制,python时间最多精确到100nS 。>>> t = time()>>> t1359587524.591781>>> t == t + 1E-6False>>> t == t + 1E-7True因此,从an开始int64并以nS进行计数就没有这些限制,并且只限于基本操作系统的精度,这已由nemo很好地解释了。
随时随地看视频慕课网APP

相关分类

Go
我要回答