在Win32中,有没有什么办法让一个独特的CPU周期数或类似的东西,这将是统一的多进程/语言/系统/等。
我创建一些日志文件,但由于我们主办.NET运行时产生多个日志文件,我想避免调用从一个到另一个记录。 因此,我想我只是生成两个文件,将它们结合起来,然后对它们进行排序,得到涉及跨世界调用一个连贯的时间表。
但是,GetTickCount的不会增加每次调用,所以这是不可靠的。 有没有更好的数字,让我排序时获得正确的顺序调用?
编辑 :感谢@格雷格说让我在赛道上QueryPerformanceCounter的,该做的伎俩。
您可以使用RDTSC CPU指令(假设86)。 该指令给出了CPU周期计数器,但要注意,它会很快提高到最大值,然后重置为0。维基百科的文章中提到,你可能会更好使用QueryPerformanceCounter的功能。
这里有一个有趣的文章! 说,不使用RDTSC,而是改用QueryPerformanceCounter的 。
结论:
使用普通的旧timeGetTime()
做的时间不是很多基于Windows的操作系统,可靠的,因为系统计时器的粒度可高达10-15毫秒,这意味着timeGetTime()
只精确到10-15毫秒。 [注意,在像Windows NT,2000和XP基于NT的操作系统出现高粒度。 Windows 95和98往往有更好的粒度,围绕1-5毫秒。]
但是,如果你调用timeBeginPeriod(1)
在你的程序的开始(和timeEndPeriod(1)
末), timeGetTime()
通常会成为精确到1-2毫秒,并会为您提供极其精确的时间信息。
Sleep()
的行为类似; 当时的长度Sleep()
实际休眠进入手在手的粒度timeGetTime()
所以在调用后timeBeginPeriod(1)
一次, Sleep(1)
将实际睡眠1-2毫秒, Sleep(2)
2-3等的,(而不是增量为10-15毫秒的高点)睡觉。
对于更高的精确定时(亚毫秒级精度),你可能会想避免使用汇编助记符RDTSC,因为它很难校准 ; 而是使用QueryPerformanceFrequency
和QueryPerformanceCounter
,其精确到小于10微秒(0.00001秒)。
对于简单的计时,都timeGetTime和QueryPerformanceCounter的工作很好,QueryPerformanceCounter的是显然更准确。 但是,如果你需要做的任何一种“定时暂停”(如必要的帧率限制),你需要小心坐在循环中调用QueryPerformanceCounter的,等待它达到一定的价值; 这将吃掉你的处理器的100%。 相反,考虑混合方案,在那里你调用sleep(1)(不要忘记timeBeginPeriod(1)第一!),只要你需要传递的时间超过1毫秒,然后只进入QueryPerformanceCounter的100%占线环路玩完你需要的延迟的第二的最后<1 /第一千。 这会给你的超精确延迟(精确到10微秒),以很小的CPU占用率。 参见上面的代码。
System.Diagnostics.Stopwatch.GetTimestamp()返回CPU周期的数量,因为一个时间原点(也许当计算机启动,但我不知道),我从来没有见过两个通话之间也没有增加。
CPU周期将具体为每台计算机,所以你不能用它来合并2台计算机之间的日志文件。
RDTSC输出可能取决于当前的核心的时钟频率,这对于现代CPU既不是恒定的,也没有在多核机器,一致。
使用系统的时间,如果处理来自多个系统的饲料使用NTP时间源。 你可以得到可靠,一致的时间读数方式; 如果开销太多你的目的,使用HPET制定出距今最后已知可靠的阅读时间比单独使用HPET更好的时间。
使用的GetTickCount和您合并日志文件添加另一个柜台。 会不会给你不同的日志文件之间的完美序列,但它至少会保持所有日志从每个文件以正确的顺序。