gpt4 book ai didi

c++ - 'clock_gettime' 和 'gettimeofday' 的奇怪计时结果

转载 作者:IT王子 更新时间:2023-10-29 01:10:15 26 4
gpt4 key购买 nike

我想检查 clock_gettime 的可靠性,使用已弃用的 gettimeofday 作为引用,但有时会得到奇怪的结果:

#include <stdio.h>
#include <sys/time.h>
#include <iostream>

void clock_gettime_test()
{
struct timespec tp;
clock_gettime(CLOCK_MONOTONIC_RAW, &tp);
long a = tp.tv_nsec;
usleep(250000);
clock_gettime(CLOCK_MONOTONIC_RAW, &tp);
long b = tp.tv_nsec;
printf("clock_gettime (%ld - %ld): %lf msec\n", b, a, (b - a)/1000000.0);
}

void gettimeofday_test()
{
struct timeval tv;
gettimeofday(&tv, NULL);
long a = tv.tv_usec;
usleep(250000);
gettimeofday(&tv, NULL);
long b = tv.tv_usec;
printf("gettimeofday (%ld - %ld): %lf msec\n", b, a, (b - a)/1000.0);
}

int main()
{
clock_gettime_test();
gettimeofday_test();
return 0;
}

构建和运行,我有时会得到正确的结果:

$ g++ -Wall play.cpp -lrt && ./a.out
clock_gettime (392441961 - 142299879): 250.142082 msec
gettimeofday (592906 - 342644): 250.262000 msec

但有时候,我没那么幸运:

clock_gettime (155321165 - 905000848): -749.679683 msec
gettimeofday (352232 - 101938): 250.294000 msec

甚至:

clock_gettime (947857371 - 697373625): 250.483746 msec
gettimeofday (225208 - 974908): -749.700000 msec

我在 i686 和 amd64 上都试过了,得到了相似的结果。我还尝试了 nanosleep,结果同样令人遗憾。

最佳答案

您只比较 struct timespectv_nsec 成员,同时您还应该比较 tv_sec 成员:

double msec = ((tpb.tv_sec - tpa.tv_sec) * 1000.0)
+ ((tpb.tv_nsec - tpa.tv_nsec) / 1000000.0);

同样,您应该比较 struct timevaltv_sectv_usec 成员以获得耗时:

double msec = ((tvb.tv_sec - tva.tv_sec) * 1000.0)
+ ((tvb.tv_usec - tva.tv_usec) / 1000.0);

关于c++ - 'clock_gettime' 和 'gettimeofday' 的奇怪计时结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11737263/

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