Delphi的"现在"时间戳有多准确

HMc*_*McG 6 delphi timestamp

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

我的直接虽然只是使用内置的Now命令来设置时间戳,但是快速谷歌似乎表明这只能准确到大约50毫秒左右.

不幸的是,我读的越多,我就越困惑.在GetTickCount和QueryPerformanceCounter上似乎存在许多相互矛盾的建议,由于当今的多核处理器和CPU限制而引发复杂化.我也看过推荐使用Windows多媒体计时器的帖子,但我似乎无法找到任何代码片段来执行此操作.

那么,任何人都可以告诉我:

1)'现在'的准确度如何.

2)是否有简单,更高精度的替代方案.

注意:我希望时间戳到10毫秒内,我不是在寻找一个计时器,只是一个更好的时间戳方法.这将在Windows 7 32位低功耗微型PC上运行.如果它有任何区别,我将使用Delphi XE或Delphi 2007.

jac*_*ate 10

根据文档,现在仅精确到最近的秒:

虽然TDateTime值可以表示毫秒,但现在仅精确到最接近的秒.

尽管如此,看看当前的实现,Now和GetLocalTime Windows API 一样准确.

进行快速测试,它显示Now返回时钟中每毫秒的值,例如:

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

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

您必须面对在Windows环境中运行的事实,您的应用程序/线程可能会在两者之间获得不同时间的处理器片,具体取决于系统的繁忙程度以及应用程序/线程的优先级与在其中运行的所有其他线程的优先级.系统.

  • 为了更加离散,你会发现`GetLocalTime`在9x操作系统上精确到55ms,在10.0K时为10.0144ms(单核非HT机器),15.625ms(多核,多CPU,HT机器)和XP(准确到'GetTickCount`到Vista),在Vista和更高版本上1ms(与GetTickCount不同). (11认同)