【问题标题】:How accurate is Delphi's 'Now' timestamp德尔福的“现在”时间戳有多准确
【发布时间】:2013-04-30 23:29:08
【问题描述】:

我将从事一个项目,该项目需要对来自自定义硬件的传入 RS232 串行和网络数据(相当)准确的时间戳。由于数据将来自多个独立的硬件来源,我需要为所有数据加上时间戳,以便将其校正/插值到标称时间点。

虽然我只是使用内置的 Now 命令来设置时间戳,但快速的 Google 似乎表明这只会精确到大约 50 毫秒左右。

不幸的是,我读得越多,我就越困惑。关于 GetTickCount 和 QueryPerformanceCounter 似乎有很多相互矛盾的建议,由于当今的多核处理器和 CPU 节流而变得复杂。我还看到了推荐使用 Windows 多媒体计时器的帖子,但我似乎找不到任何代码 sn-ps 来执行此操作。

那么,谁能给我建议:

1) “现在”的准确度。

2) 是否有简单、准确度更高的替代方案。

注意:我希望将时间戳记在 10 毫秒内,我并不是在寻找这样的计时器,只是一种更好的时间戳方法。这将在 Windows 7 32 位低功耗微型 PC 上运行。如果有什么不同,我将使用 Delphi XE 或 Delphi 2007。

【问题讨论】:

  • 存储任何数据的延迟将远远超过系统时钟的准确性,不是吗?即使您在单独的线程中运行每个连接,接收数据/存储数据/获取下一个数据点也将远远超过 50 毫秒,IMO。 (IIRC,Windows 中时钟计时器的延迟大约为 18 毫秒,所以我怀疑您是否可以获得比使用系统时钟更精细的时间戳。)高频计数器可以变得更精细(作为链接的链接在右侧显示的“相关* 列表顶部”更细化,但执行起来很慢。(@TLama 的链接。)
  • 这可能会有所帮助:thedelphigeek.com/2007_11_01_archive.html 不要错过最后关于从 Vista 开始的 Windows 版本的部分。
  • 这个问题让我想到了How soon is Now?
  • 由于所有标准方法(getTickCount、计时器)都不足以满足您的需求(我猜),您应该切换到性能计数器。最终将它与现在结合起来......例如
  • 别让我在你面前扮演莫里西,赫弗南。生活是猪圈。

标签: delphi timestamp


【解决方案1】:

根据文档,Now 只精确到最接近的秒数:

虽然 TDateTime 值可以表示毫秒,但 Now 只能精确到最接近的秒。

尽管如此,看看当前的实现,Now 与GetLocalTime windows API 一样准确。

做一个快速测试,它显示现在返回时钟中每一毫秒的值,例如:

begin
  System.SysUtils.FormatSettings.LongTimeFormat := 'hh:mm:ss.zzz';
  for I := 1 to 5000 do
    Writeln(TimeToStr(Now()));
end.

当我从命令行project1 >times.txt 执行此控制台程序时,在一台 Windows 7 64 位机器上,我得到了一个持续运行 29 毫秒的文件(文件中没有丢失任何文件)。

您必须面对这样一个事实,即在 Windows 环境中运行时,您的应用程序/线程可能会在不同的时间获得处理器片,这取决于系统的繁忙程度以及您的应用程序/线程相对于所有其他线程的优先级在系统中运行。

【讨论】:

  • 为了更加离散,你会发现GetLocalTime 在 9x OS 上精确到 55 毫秒,10.0144 毫秒(单核非 HT 机器),15.625 毫秒(多核,多-CPU、HT 机器)在 2K 和 XP 上(与 GetTickCount 直到 Vista 一样准确),在 Vista 及更高版本上为 1 毫秒(不同于 GetTickCount)。
  • 不错的发现,当然这取决于操作系统,MS 文档没有关于精度的信息。
  • 确实如此。该信息仅取决于网络搜索和个人测试。我认为有价值的文章之一是 Gabr 的blog entry
  • 谢谢大家。文档有点缺乏。我意识到 Windows 可能不是此类控制器的理想操作系统,但用户熟悉度很重要。幸好它是一台专用 PC,所以我将能够控制负载并且应该能够指定处理器,所以提供的所有信息都非常有用。
猜你喜欢
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多