【问题标题】:Get time in milliseconds on Windows在 Windows 上以毫秒为单位获取时间
【发布时间】:2023-02-08 23:15:16
【问题描述】:

对于我用 C (C11) 编写的 PRNG 算法,我需要一种高精度(毫秒或微秒)的时间,因为 time(0) 不够精确。

我尝试使用我在 StackOverflow 上找到的其他几种可能的解决方案,但它们都不适合我。

【问题讨论】:

  • 你尝试了什么,他们怎么不适合你?
  • 对于 Win32,您可以使用 GetTickCount64()
  • @Scott Hunter 从技术上讲,它们都有效,但由于我的程序运行太快,我总是会得到 0 作为时差
  • 通常,您会在程序开始时抽出时间为 PRNG 播种一次,而不是重复播种。或者进程每秒停止和启动多次?

标签: c random time


【解决方案1】:

从 C11 开始,您可以使用 struct timespectimespec_get 以秒和纳秒为单位获得与 time(NULL) 相同的值:

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

int main(void)
{
    struct timespec ts;
    timespec_get(&ts, TIME_UTC);
    printf("Time since epoch: %ld seconds, %ld nanoseconds", ts.tv_sec, ts.tv_nsec);
}

【讨论】:

  • 这段代码只是引发了一个错误
【解决方案2】:

您可以使用 GetSystemTimeAsFileTime 函数,它以 100ns 的间隔为您提供自 1/1/1601 UTC 以来的当前时间。

FILETIME ft;
uint64_t ts;
GetSystemTimeAsFileTime(&ft);

ts = 0;
ts |= ft.dwHighDateTime;
ts <<= 32;
ts |= ft.dwLowDateTime;

请注意,系统时钟很可能不是那么精确,因此不要指望 100ns 的粒度。

另一种选择是QueryPerformanceCounter,它会给你从不确定的起点开始的微秒间隔:

LARGE_INTEGER ticks;
QueryPerformanceCounter(&ticks);
uint64_t ts = ticks.QuadPart;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 2017-08-05
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多