编程,应用程序和操作系统的时间准确性

时间:2012-05-02 11:38:04

标签: language-agnostic time timing

这不仅仅是一个家庭作业问题,而是一个分支。

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

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

您可以非常轻松地考虑网络延迟,但在数据发送之前,本地情况又如何呢?到目前为止,似乎所有人都得出结论,时间函数永远不会完全准确 - 这只是一个公认的不准确。

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

1 个答案:

答案 0 :(得分:1)

实际上是家庭作业!

我们称之为time的事情正在发展。很久以前的事情 甚至没有携带号码。只是旅行的太阳和旅行的星星正在给予 关于时间的暗示。后来,特别是自数字革命开始以来,数字 被分配到time。 进展时间伴随着数字的增加。没有多说什么 不同的格式我声明大多数这些方案确实有一个时间的orgin。 Unix epoche 例如,1970年1月1日的00:00:00 UTC时间。当然,这不是时间的开始,但选择这样的虚拟起源以将数字拟合到合理的数据结构中。 Back to you question:我们能够捕获当前时间吗?不,我们不会,我们永远不会。读取任何时钟都会告诉我们灯光离开时钟到达我们眼睛的时间。它可能很少但是...... 当有人问我们时间时,我们很高兴地告诉你。但是又发生了一些延迟,我相信我们会在不增加延迟的情况下同时说出来。

知道物理学,我们可以增加光到达我们眼睛的延迟,我们大脑的延迟以及我们说出的话语需要延迟到达被问到的人的耳朵。

但是..........

那么如何实现真实的世界时间应用呢?没有THAT TIME。时间取决于你的位置,时间取决于你周围的重力,时间取决于你的速度,等等。

但是.........

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

Again back to your question:通常在软件问题上,关于时间的问题基本上是关于进度和/或同步的问题。你想比较一些东西。 基本上,有两种可能的calls资源可以提供名为time的进度:first call会在您拨打电话时返回time。但是你需要考虑到你以后会得到结果。所以你得到的时间有点过去了。 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(什么都不能!)
  6. 仔细研究Windows的高分辨率时间服务的实现可以在Windos Timestamp Project找到。