gpt4 book ai didi

clock_gettime纳秒计算

转载 作者:太空狗 更新时间:2023-10-29 11:05:10 25 4
gpt4 key购买 nike

引用:linux clock_gettime

我找到了一个计算处理时间的公式,但有些地方我不明白。查看下面的结果。

前两行只是为了在各自的列中显示论坛。

我只显示了快速运行的 3 个结果。
有趣的部分在最后一行,为什么 5551 - 999896062 纳秒 = 18446744072709661105?
为什么 18446744072709661105+1/1E9 = 0.000109?

我认为正在进行的某些数据转换会影响结果?

xx:      | t1.tv_sec |   | t1.tv_nsec |          | t2.tv_sec |   | t2.tv_nsec 
xx: t2-t1(sec) t2-t1(nsec) (t2-t1(sec))+(t2-t1(nsec))/1E9

52291: | 30437 | | 999649886 | | 30437 | | 999759331
52291: 0 109445 0.000109

52292: | 30437 | | 999772970 | | 30437 | | 999882416
52292: 0 109446 0.000109

52293: | 30437 | | 999896062 | | 30438 | | 5551
52293: 1 18446744072709661105 0.000109

源代码:

int main() {
struct timespec t1, t2;

int i = 0;
while(1) {
clock_gettime(CLOCK_MONOTONIC, &t1);
for(int j=0;j<25000;j++) { };
clock_gettime(CLOCK_MONOTONIC, &t2);
printf("%d: \t | %llu | \t | %lu | \t\t | %llu | \t | %lu \n", i, (unsigned long long) t1.tv_sec, t1.tv_nsec, (unsigned long long) t2.tv_sec, t2.tv_nsec);
printf("%d: \t %llu \t %lu \t\t %lf\n", i, (unsigned long long) t2.tv_sec - t1.tv_sec, t2.tv_nsec - t1.tv_nsec, (t2.tv_sec - t1.tv_sec)+(t2.tv_nsec - t1.tv_nsec)/1E9);
if ((t2.tv_sec - t1.tv_sec) == 1) break;
i++;
}
return 0;
}

最佳答案

因为 5551 - 999896062 是一些负值,存储在 long 类型的临时变量中,但由于 %lu 转换说明符而被 printf 解释为“unsigned long”。

请注意,struct timespec 中的 tv_nsec 字段是 long 类型,而不是 unsigned long。同样,在 Linux 和其他 Unix 系统上,time_t 是有符号整数类型的 typedef。所以去掉代码中所有未签名的东西。

顺便说一句,减去两个 timespec 实例的方法是


timespec diff(timespec start, timespec end)
{
timespec temp;
if ((end.tv_nsec - start.tv_nsec) < 0)
{
temp.tv_sec = end.tv_sec - start.tv_sec - 1;
temp.tv_nsec = 1000000000 + end.tv_nsec - start.tv_nsec;
}
else
{
temp.tv_sec = end.tv_sec - start.tv_sec;
temp.tv_nsec = end.tv_nsec - start.tv_nsec;
}
return temp;
}

关于clock_gettime纳秒计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13950290/

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