在 Python 中测量短间隔的最安全、最可靠的方法是什么?(跨平台、跨硬件、耐 DST 和闰秒)



我对日期时间算术了解得越多,我就越头疼。

有很多不同类型的时间:

  • 民事时间
  • 世界协调时
  • UNIX 时间
  • 系统时间
  • 线程时间
  • 中央处理器时间

然后时钟可以跑得更快或更慢,或者向后或向前跳跃,因为

  • 夏令时
  • 跨时区移动
  • 闰秒
  • NTP 同步
  • 广义相对论

如何处理这些问题依次取决于:

  • 操作系统
  • 硬件
  • 程序设计语言

那么,对于我的特定用例,有人可以告诉我,测量短间隔的最安全,最可靠的方法吗?这是我正在做的事情:

我正在用Python(3.7.x)制作游戏,我需要跟踪某些事件已经有多长时间了。例如,玩家按住按钮的时间,或者敌人发现玩家的时间,或者加载关卡的时间。时间刻度应精确到毫秒(纳秒是矫枉过正)。

以下是我想确保避免的情况:

  • 你在深夜玩游戏。在您的时区中,当晚,时钟在凌晨 2 点(夏令时)向前移动一小时,因此分钟数为:1:58、1:59、2:00、3:01、3:02。游戏中每个与时间相关的变量都会突然增加一个小时 - 它认为你已经按住了该按钮一个小时2秒,而不仅仅是2秒。灾难接踵而至。

  • 同样,但 IERS 决定在当天的某个时候插入或减去闰秒。你玩完过渡,所有时间变量都会得到额外的一秒加减。灾难接踵而至。

  • 您在火车或飞机上玩游戏,当您越过时区边界和/或国际日期变更线时,灾难随之而来。

  • 游戏在某些硬件和操作系统上在
  • 上述情况下正常运行,但在其他硬件和操作系统上则无法正常工作。 也就是说,它在Linux上中断,但不是Windows,反之亦然。

而且我真的不能为这些编写测试,因为有问题的事件很少出现。我需要在第一次就把它做好。那么,我需要使用什么与时间相关的功能?我知道有普通的旧time.time(),但也有一系列令人眼花缭乱的其他选项,例如

  • time.clock()
  • time.perf_counter()
  • time.process_time()
  • time.monotonic()
  • 然后是上述所有内容的纳秒变体。

从阅读文档来看,似乎time.monotonic()是我想要的。但是,如果阅读计时的所有细节教会了我什么,那就是这些东西从来都不是看起来的那样。曾几何时,我以为我知道什么是"秒"。现在我不太确定。

那么,如何确保我的游戏时钟正常工作?

时间模块的规范是查找每个模块详细信息的最佳位置。

在那里,您可以轻松看到:

  • time.clock()已弃用,应替换为其他函数
  • time.process_time()只计算进程花费的 CPU 时间,因此不适合测量挂钟时间(这是您需要的)
  • time.perf_counter()有与time.process_time()相同的问题
  • time.time()差不多了,但如果用户修改当前时间,它会给出糟糕的时机
  • time.monotonic()- 这
  • 似乎是测量时间间隔的最安全的选择 - 请注意,这根本不会给你当前时间,但它会给你两个时间点之间的正确差异

至于纳秒版本,您应该仅在需要纳秒时才使用这些版本。

最新更新