Time 围棋的时间有多精确,真的?

Time 围棋的时间有多精确,真的?,time,go,Time,Go,Go的时间包声称精度为纳秒。 我想知道它是如何实现的,我是否可以信任它。我的疑问来自Python,它清楚地记录了它的困难和时间限制: 从 各种实时函数的精度可能小于 由表示其值或参数的单位表示。 例如,在大多数Unix系统上,时钟一周只“滴答”50或100次 第二 另一方面,时间和睡眠的精确度要比 它们的Unix等价物:时间表示为浮点数, time返回使用Unix可用的最准确时间 在有时间的情况下,gettimeofday和sleep将接受一段时间 非零分数Unix select用于实现此功能

Go的时间包声称精度为纳秒。

我想知道它是如何实现的,我是否可以信任它。我的疑问来自Python,它清楚地记录了它的困难和时间限制:

各种实时函数的精度可能小于 由表示其值或参数的单位表示。 例如,在大多数Unix系统上,时钟一周只“滴答”50或100次 第二

另一方面,时间和睡眠的精确度要比 它们的Unix等价物:时间表示为浮点数, time返回使用Unix可用的最准确时间 在有时间的情况下,gettimeofday和sleep将接受一段时间 非零分数Unix select用于实现此功能,其中 可用


由于操作系统给python带来了如此艰难的时间,Go如何达到纳秒级的精度?

以及时间的实现。现在回到运行时实现的函数。 在本例中,您可以查看和linux amd64的实现。然后使用,它提供纳秒分辨率。在windows上,这是通过调用GetSystemTimeAsFileTime来实现的,GetSystemTimeAsFileTime不是高分辨率而是纳秒

因此,是的,分辨率取决于操作系统,你不能期望它在每个操作系统上都是准确的,但开发人员正在努力使它尽可能好。例如,在go1.0.3中,time·now表示FreeBSD,而不是clock_gettime,后者仅提供毫秒精度。您可以通过查看AX中存储的值看到这一点,因为它是。如果查看引用的程序集,可以看到ms值乘以1000得到纳秒。但是,这是固定的


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

Python函数的一个问题是它返回一个错误。浮点数是一个具有53位精度的数字

由于从1970-01-01到现在已经超过了2**30秒,因此历元需要61 31+30位的精度来存储从1970-01-01到现在精确到纳秒的时间

不幸的是,这比python浮点中可以存储的数据少了7或8位,这意味着python浮点总是不如go-time精确

为了量化,下面的演示显示python时间最多精确到100nS,这仅仅是由于float类型的限制


因此,从int64开始,以nS为单位计数没有这些限制,仅限于底层操作系统的精度,nemo对此做了很好的解释。

如果您有兴趣查询操作系统以获取clock_gettime返回的值的精度,您可以使用适合您的操作系统的syscall包对进行syscall。例如,在Unix平台上,您可以执行以下操作:

包干管 进口 fmt golang.org/x/sys/unix func main{ res:=unix.Timespec{} unix.ClockGetresunix.CLOCK\u单调,&res fmt.printfmononic时钟分辨率为%d纳秒\n,分辨率为纳秒 }
时间包使用单调时钟的值进行比较和涉及时间的运算;墙上时钟时间的精度同样可以通过将上面示例中的unix.clock\u MONOTONIC更改为unix.clock\u REALTIME来获得。

此文档表示GetSystemTimeAsFileTime以100纳秒的间隔工作,而不是nanoseconds@GeorgePolevoy当然,基本单位仍然是纳秒。时钟使用100纳秒的分辨率,因此它以100纳秒的步长递增,这使您能够以纳秒为单位计数,尽管不如单个纳秒精确。正如我在回答中所说的。
>>> t = time()
>>> t
1359587524.591781
>>> t == t + 1E-6
False
>>> t == t + 1E-7
True