zoukankan      html  css  js  c++  java
  • gettimeofday

    作用:
    需要打印代码执行到某处的时间,或者需要计算程序执行的时间差(精确到微妙级)。这时会用到gettimeofday函数,它可以返回自1970-01-01 00:00:00到现在经历的秒数。

    原型:

    int gettimeofday(struct timeval *tv, struct timezone *tz)
    

    所需头文件:

    #include <sys/time.h>
    

    参数说明:

    struct timeval:

    struct timeval{  
        long int tv_sec; // 秒数  
        long int tv_usec; // 微秒数  
    }  
    

    其中time_t和suseconds_t都是long int类型。在32位下为4个字节,能够表示的最大正整数是2147483647,而这个表示的时间最大能到2038-01-19 03:14:07,超过了之后就变为-2147483648,这就是linux2038年的问题。而64位系统下的time_t类型即long类型长度为8个字节,可以用到几千亿年,这么长的时间完全不用担心溢出的问题。

    在利用tv_sec和tv_usec计算毫秒数时,需要注意溢出的问题:

    struct timeval tv;
    gettimeofday(&tv, NULL);
    long long ts = (long long)tv.tv_sec*1000 + tv.tv_usec/1000;
    

    注意了其中的(long long)类型转换对于32位的系统是必须的,否则乘上1000会溢出。有些人可能没有注意到这个问题,因为溢出后计算出来的值也是随时间递增的,而且计算一段时间差也是对的。但严谨的工程师都应该注意到因字长不足导致的溢出错误。

    struct timezone:

    struct timezone{  
        int tz_minuteswest;/*格林威治时间往西方的时差*/  
        int tz_dsttime;/*DST 时间的修正方式*/  
    }  
    

    timezone 参数若不使用则传入NULL即可。
    在一段代码前后分别使用gettimeofday可以计算代码执行时间:

    #include <assert.h>
    #include <sys/time.h>
    
    int main()
    {
        float time_use=0;
        struct timeval start;
        struct timeval end;
        gettimeofday(&start,NULL); 
        printf("start.tv_sec:%dn",start.tv_sec);
        printf("start.tv_usec:%dn",start.tv_usec);
    
        fun();
        time_use=(end.tv_sec-start.tv_sec)*1000000+(end.tv_usec-start.tv_usec);//微秒
        printf("time_use is %fn us",time_use);
    }
    
  • 相关阅读:
    访问 http://localhost:8081对 flink 集群和任务进行监控管理
    Flink之流处理WordCount
    Flink之批处理WordCount
    为什么说JAVA中runnable接口的run方法运行在子线程?
    Java中的字符输入输出流练习
    在JAVA中实现文件读写练习
    JAVA自定义异常使用方法
    三种二叉树遍历的非递归算法
    C编译错误:Main.c:4:5: error: variably modified ‘f’ at file scope int f[maxn];
    中序+先序构造二叉树,后序遍历
  • 原文地址:https://www.cnblogs.com/chay/p/10587529.html
Copyright © 2011-2022 走看看