• 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);
    }
    
  • 相关阅读:
    atcoder 2017Code festival C ——D题 Yet Another Palindrome Partitioning(思维+dp)
    51nod 1089最长回文子串V2 (manacher)
    Codeforces Round #362(Div1) D Legen...(AC自动机+矩阵快速幂)
    51nod 1532 带可选字符的多字符串匹配(位运算)
    51nod 1317 相似字符串对(容斥原理+思维)
    51nod 1526 分配笔名(字典树+贪心)
    51nod 1292 字符串中的最大值V2(后缀自动机)
    51nod 1277字符串中的最大值(拓展kmp)
    SPOJ:[DIVCNT3]Counting Divisors
    单纯形法模板
  • 原文地址:https://www.cnblogs.com/chay/p/10587529.html
Copyright © 2020-2023  润新知