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

标签 c time profiling cross-platform

有没有一种方法可以使用跨平台方法在 C 语言中获得毫秒精度、准确(至少在几毫秒内)的时间?

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

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

最佳答案

我还没有找到一个跨平台的解决方案来测量 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

关于c - C - 跨平台中函数的毫秒精度计时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17639213/

相关文章:

c - 使用线程打开 2 个控制台时程序卡住

python - 逐行分析 Django View

c - 如何分析/识别紧密处理循环中的缓慢步骤?

regex - 如何分析 Perl 正则表达式?

谁能解释这种晦涩的行为?

c - 如果我向一个条件变量发出 N 次信号,它会解锁 N 个线程吗?

C信号量奇怪的优先行为

java.text.ParseException : Unparseable date: "20:01:00.000Z"

python - 如何转换为 "end-of-month"?

time - Modelica 仿真和方程初始化的总时间计算