2

这不是严格意义上的家庭作业问题,而是一个分支。

时间函数是如何在面向对象语言和命令式语言(如 C)中实现的?如果您要获得以纳秒为单位的时间戳并将其转换为字符串,那么时间不会总是不准确吗?

事实上,只要你做任何计算或使用计时数据,它现在不是不准确到某种未知的程度吗?这个假设正确吗?

您可以很容易地解决网络延迟问题,但是在发送数据之前本地呢?到目前为止,似乎每个被问到的人都得出结论,时间函数永远不会完全准确——这只是一种公认​​的不准确。

本质上,我要问的是如何实现现实世界的时间应用程序?

4

1 回答 1

1

其实功课!

我们称之为time进步的东西。很久以前,这东西甚至没有数字。只有行进的太阳和行进的星星在暗示时间。后来,特别是自从数字革命开始以来,数字被分配给time. 进步的时间伴随着递增的数字。不用多说所有不同的格式,我声明大多数这些方案在当时确实有一个起源。例如,Unix 纪元是 1970 年 1 月 1 日 00:00:00 UTC 时间。当然,这不是时间的开始,而是选择这样的虚拟起源以将数字放入合理的数据结构中。 Back to you question:我们是否能够捕获当前时间?不,我们不是,我们永远也做不到。阅读任何时钟都会告诉我们光线离开时钟到达我们眼睛的时间。可能很少,但是……当有人问我们时间时,我们很乐意告诉我们。但是又发生了一些延迟,我相信我们会在不增加延迟的情况下告诉相同的时间。

了解物理学后,我们可以增加光线到达眼睛的延迟、大脑的延迟以及口语到达被问者耳朵所需的延迟。

但..........

那么如何实现一个真实世界的时间应用程序呢?没有THAT TIME。时间取决于你在哪里,时间取决于你周围的重力,时间取决于你的速度,等等。

但.........

并不是因为时间流逝而发生的事情。不,时间会让事情发生!

Again back to your question:通常在软件方面,关于时间的问题基本上是关于进度和/或同步的问题。您想与某物进行比较。calls基本上,提供此进度的资源有两种可能,称为timefirst calltime在您拨打电话时返回。但是您需要考虑到稍后会得到结果。所以你得到的时间有点过去了。second call返回time调用返回的位置。这是一个稍微不同的实现,因为这样的函数必须知道它自己的服务需要多长时间。这可能只有通过一些校准才能实现。

这是两个主要的电话。

说到resolution(再次回到您的问题),我想排除将原子钟连接到您的计算机的选项。假设您拥有一台现成的超市计算机。它可能运行在几GHz。您可能观察到的最高频率可能是 CPU 频率。在说 4GHz 时,这样的频率将导致计数器在一纳秒内增加 4 次,即 250 皮秒的时间分辨率。所以通常你可能会说有亚纳秒级的分辨率。实际上,常用的高频计数器在 MHz 范围内,这将提供 100ns 单位范围内的分辨率。

但.......

这些高频可以用作时间的标尺吗?从短期来看,他们可以!但从长远来看,它要复杂得多,因为这些时间源必须与常见的时间源锁相,例如您的电脑时间。高频计数器确实有很大的误差,会导致许多 us/s 的相位漂移。这只能通过仔细校准来克服。适当的校准可以允许将高频计数器锁相到系统时间。

一旦你有一个精确到几微秒范围内的时间源,你可能会以完全不同的方式诊断代码的行为,因为你可以预测潜在的延迟。

总结(一种哲学方法):

  1. 时间让事情发生。
  2. 时间is从不真实或代表真实价值
  3. 任何与时间相关的值都代表过去的时间
  4. actual time在实践中没有这样的事情
  5. 最后,正如您所说:(Time can never be completely accurate没有什么可以!)

可以在Windos Timestamp Project中详细了解 Windows 的高分辨率时间服务的实现。

于 2012-07-14T16:51:15.597 回答