C中函数的毫秒精度计时 - 跨平台

Posted

技术标签:

【中文标题】C中函数的毫秒精度计时 - 跨平台【英文标题】:millisecond precision timing of functions in C - crossplatform 【发布时间】:2013-07-14 12:03:42 【问题描述】:

有没有办法使用跨平台方法在 C 语言中获得毫秒级的精度和准确度(至少在几毫秒内)?

在 POSIX 系统上,我可以使用 sys/time.h,但这不是跨平台的。

stdlib time() 函数只提供二级精度

【问题讨论】:

您可以随时循环检查当前时间......您能否提供更多信息,包括您尝试的原因和尝试的内容? 你能不能在一个循环中运行子程序 1000 次,以秒为单位测量时间,然后除以 1000。顺便说一句,在处理器中,毫秒是 long 时间. 这是用于可能在 ~50 毫秒到 10 秒范围内运行的计时算法 【参考方案1】:

我还没有找到用 C 语言测量时间的跨平台解决方案。但是,我所做的是对 Unix 和 Windows 使用几乎相同的功能。我创建了这个gist,因为我每次都必须重新查找它。简而言之:

Unix

#include <time.h>

long diff_micro(struct timespec *start, struct timespec *end)

    /* us */
    return ((end->tv_sec * (1000000)) + (end->tv_nsec / 1000)) -
        ((start->tv_sec * 1000000) + (start->tv_nsec / 1000));


long diff_milli(struct timespec *start, struct timespec *end)

    /* ms */
    return ((end->tv_sec * 1000) + (end->tv_nsec / 1000000)) -
        ((start->tv_sec * 1000) + (start->tv_nsec / 1000000));


int main(int argc, char **argv)

    struct timespec start, end;

    clock_gettime(CLOCK_MONOTONIC, &start);

    // Activity to be timed
    sleep(1000);

    clock_gettime(CLOCK_MONOTONIC, &end);

    printf("%ld us\n", diff_micro(&start, &end));
    printf("%ld ms\n", diff_milli(&start, &end));

    return 0;

source for Unix solution

Win32

#include <Windows.h>

long diff_micro(LARGE_INTEGER *start, LARGE_INTEGER *end)

    LARGE_INTEGER Frequency, elapsed;

    QueryPerformanceFrequency(&Frequency); 
    elapsed.QuadPart = end->QuadPart - start->QuadPart;

    elapsed.QuadPart *= 1000000;
    elapsed.QuadPart /= Frequency.QuadPart;

    return elapsed.QuadPart;


long diff_milli(LARGE_INTEGER *start, LARGE_INTEGER *end)

    LARGE_INTEGER Frequency, elapsed;

    QueryPerformanceFrequency(&Frequency); 
    elapsed.QuadPart = end->QuadPart - start->QuadPart;

    elapsed.QuadPart *= 1000;
    elapsed.QuadPart /= Frequency.QuadPart;

    return elapsed.QuadPart;


int main(int argc, char **argv)

    LARGE_INTEGER StartingTime, EndingTime;

    QueryPerformanceCounter(&StartingTime);

    // Activity to be timed
    Sleep(1000);

    QueryPerformanceCounter(&EndingTime);

    printf("%ld us\n", diff_micro(&StartingTime, &EndingTime));
    printf("%ld ms\n", diff_milli(&StartingTime, &EndingTime));

    return 0;

source used for Win32 solution

【讨论】:

【参考方案2】:

你可以试试这样的:-

#include <time.h>
clock_t uptime = clock() / (CLOCKS_PER_SEC / 1000);

看到这个Link

【讨论】:

clock 提供 CPU 时间,而不是实时。它在阻塞时停止,如果是多线程的,它会更快。【参考方案3】:

最好的方法是使用std::chrono

#include <chrono>

...

auto begin = std::chrono::high_resolution_clock::now();

...

auto end = std::chrono::high_resolution_clock::now();
elapsedTime = std::chrono::duration_cast<std::chrono::milliseconds>(end - begin).count();

【讨论】:

以上是关于C中函数的毫秒精度计时 - 跨平台的主要内容,如果未能解决你的问题,请参考以下文章

VC中如何获取当前时间(精度达到毫秒级)

C++两种计时方式(windows平台,毫秒级&微秒级)

如何在 Ruby 中以毫秒为单位计时?

C#下利用高精度计时器进行计时操作

我可以使用 Excel for Mac 将代码计时到毫秒吗

使用 WXPython 在 Python 中的计时精度