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如何实现其纳秒精度?
nem*_*emo 33
就实现而言,time.Now()
回退到运行时中实现的函数.您可以查看C时间实现和time·now
汇编中的实现(在本例中为linux amd64).然后使用clock_gettime
,提供纳秒级分辨率.在Windows上,这是通过调用来实现的GetSystemTimeAsFileTime
,这也会产生纳秒(不是高分辨率而是纳秒).
所以,是的,分辨率取决于操作系统,你不能指望它在每个操作系统上都是准确的,但开发人员正在努力使其尽可能好.例如,在go1.0.3,time·now
为FreeBSD 使用gettimeofday
代替clock_gettime
,其中仅提供了精确到毫秒.您可以通过查看存储的值来查看AX
,因为它是系统调用ID.如果您查看引用的程序集,您可以看到ms值被多次乘以1000以获得纳秒.但是,现在已经修复了.
如果您想确定,请检查运行时源代码中的相应实现,并询问操作系统的手册.
Nic*_*ood 14
Python的time.time函数的一个问题是它返回一个浮点数.float是IEEE 754双精度数,具有53位精度.
由于自1970-01-01(纪元)以来现在超过2**30秒,因此需要61(31 + 30)位精度来存储自1970-01-01以来精确到纳秒的时间.
不幸的是,这比你在python float中存储的内容短7或8位,这意味着python浮点数总是不如go time精确.
为了量化,下面的演示表明,由于float
类型的限制,python时间最多精确到100nS .
>>> t = time()
>>> t
1359587524.591781
>>> t == t + 1E-6
False
>>> t == t + 1E-7
True
Run Code Online (Sandbox Code Playgroud)
所以,从一开始int64
和计数nS没有这些限制,并且仅限于底层操作系统的精度,正如nemo所解释的那样.