首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解gettimeofday的输出

理解gettimeofday的输出
EN

Stack Overflow用户
提问于 2022-01-29 22:25:27
回答 1查看 168关注 0票数 0

我试图了解gettimeofday()系统调用的精确性。这是我的节目:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/time.h>

int main(int argc, char *argv[])
{
    struct timeval t;
    int prev = 0;
    for (int i = 0; i < atoi(argv[1]); i++)
    {
        gettimeofday(&t, NULL);
        printf("secs: %ld, nmicro_secs: %d, delta: %d\n", t.tv_sec, t.tv_usec, t.tv_usec - prev);
        prev = t.tv_usec;   
        sleep(1);
    }   

    return 0;
    
}

如果我运行这个程序(./a.out 10),输出是,

代码语言:javascript
复制
secs: 1643494972, nmicro_secs: 485698, delta: 485698
secs: 1643494973, nmicro_secs: 490785, delta: 5087
secs: 1643494974, nmicro_secs: 491121, delta: 336
secs: 1643494975, nmicro_secs: 494810, delta: 3689
secs: 1643494976, nmicro_secs: 500034, delta: 5224
secs: 1643494977, nmicro_secs: 501143, delta: 1109
secs: 1643494978, nmicro_secs: 506397, delta: 5254
secs: 1643494979, nmicro_secs: 509905, delta: 3508
secs: 1643494980, nmicro_secs: 510637, delta: 732
secs: 1643494981, nmicro_secs: 513451, delta: 2814

秒列似乎与1秒的睡眠相协调。有人能解释一下微秒列中的值是怎么回事吗?从睡眠到睡眠的跳跃大约是1毫秒。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-29 22:38:42

仅使用.tv_usec字段计算两个连续调用之间的差异。换句话说,您正在放弃.tv_sec字段,因此,如果第一次度量产生.tv_sec=1, .tv_usec=500000 (意味着自纪元以来的1.5s ),而第二次度量产生.tv_sec=2, .tv_usec=500000 (意味着自纪元以来的2.5s ),那么您的delta将完全是0,这是错误的。

您必须考虑到整个值:t.tv_sec * 1000000 + t.tv_usec。只有这样,你才能计算出有意义的差异。注意,您需要一个比int大的类型来保存这个值。像uintmax_t这样的东西应该是足够的。或者,注释中的as @zwol suggests,如果要计算没有中间类型的差异,则为两个不同的struct timeval

我想了解gettimeofday()系统调用的精确性

在任何情况下,您所做的都不会告诉您gettimeofday的精度,这是另一回事。睡在两个系统之间会使您的进程在不那么确定的时间内处于不活动状态。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70910268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档