gpt4 book ai didi

c - c中的时间戳,精度为毫秒

转载 作者:可可西里 更新时间:2023-11-01 14:43:55 31 4
gpt4 key购买 nike

我是 C 编程的新手,我正在从事一个需要非常准确的时间的项目;因此我尝试写一些东西来创建一个精确到毫秒的时间戳。

这似乎可行,但我的问题是这种方法是否正确,或者是否有更简单的方法?这是我的代码:

#include<stdio.h>
#include<time.h>

void wait(int milliseconds)
{
clock_t start = clock();
while(1) if(clock() - start >= milliseconds) break;
}

int main()
{
time_t now;
clock_t milli;
int waitMillSec = 2800, seconds, milliseconds = 0;
struct tm * ptm;

now = time(NULL);
ptm = gmtime ( &now );
printf("time before: %d:%d:%d:%d\n",ptm->tm_hour,ptm->tm_min,ptm->tm_sec, milliseconds );

/* wait until next full second */
while(now == time(NULL));

milli = clock();
/* DO SOMETHING HERE */
/* for testing wait a user define period */
wait(waitMillSec);
milli = clock() - milli;

/*create timestamp with milliseconds precision */
seconds = milli/CLOCKS_PER_SEC;
milliseconds = milli%CLOCKS_PER_SEC;
now = now + seconds;
ptm = gmtime( &now );
printf("time after: %d:%d:%d:%d\n",ptm->tm_hour,ptm->tm_min,ptm->tm_sec, milliseconds );
return 0;
}

最佳答案

以下代码似乎可以提供毫秒粒度:

#include <windows.h>
#include <stdio.h>

int main(void) {
SYSTEMTIME t;
GetSystemTime(&t); // or GetLocalTime(&t)
printf("The system time is: %02d:%02d:%02d.%03d\n",
t.wHour, t.wMinute, t.wSecond, t.wMilliseconds);
return 0;
}

这是基于http://msdn.microsoft.com/en-us/library/windows/desktop/ms724950%28v=vs.85%29.aspx .上面的代码片段在 Windows 7 上使用 CYGWIN 进行了测试。

对于 Windows 8,有 GetSystemTimePreciseAsFileTime ,它“以尽可能高的精度 (<1us) 检索当前系统日期和时间。”

您最初的方法可能在 99.99% 的情况下都没有问题(忽略一个小错误,如下所述)。你的方法是:

  • 通过重复调用 time() 直到值发生变化,等待下一秒开始。
  • 保存 time() 的值。
  • 保存 clock() 的值。
  • 使用 clock() 的当前值和两个保存的值计算所有后续时间。

您的小错误是您颠倒了前两个步骤。

但即使固定了这个,也不能保证 100% 有效,因为没有原子性。两个问题:

  • 您的代码循环 time() 直到您进入下一秒。但是您对它有多?它可能是 1/2 秒,甚至几秒(例如,如果您正在运行带有断点的调试器)。

  • 然后调用clock()。但是这个保存的值必须“匹配”time() 的保存值。 如果这两个调用几乎是瞬时的,就像它们通常那样,那么这很好。但 Windows(和 Linux)的时间片等无法保证。

另一个问题是时钟的粒度。如果 CLOCKS_PER_SEC 是 1000,就像您系统上的情况一样,那么您当然可以做的最好是 1 毫秒。但它可能比这更糟:在 Unix 系统上,它通常是 15 毫秒。您可以通过将 clock 替换为 QueryPerformanceCounter(), 来改进这一点,如 timespec equivalent for windows 的答案中所示,但考虑到前两个问题,这可能是多余的。

关于c - c中的时间戳,精度为毫秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21888229/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com