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);
    }
    
  • 相关阅读:
    SQL SERVER将远程服务器的数据库备份到本地文件夹
    c#下各种数据库操作的封装!(支持ACCESS,SQLSERVER,DB2,ORACLE,MYSQL)
    CentOS 7 服务器配置安装CentOS 7
    String,StringBuffer与StringBuilder
    springmvc常用注解标签详解【转】
    第一个SpringMVC实例和解析(HelloSpringMVC)
    排序算法总结及Java实现
    MySQL实例
    Java集合框架梳理(含经典面试题)
    面试妆容
  • 原文地址:https://www.cnblogs.com/chay/p/10587529.html
Copyright © 2011-2022 走看看