Linux中获得程序时间的函数

精确一点的是用gettimeofday(),不精确的可以用clock();

1、gettimeofday()函数

1.简介:

在C语言中可以使用函数gettimeofday()函数来得到时间。它的精度可以达到微妙

2.函数原型:

#include<sys/time.h>

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

3.说明:

gettimeofday()会把目前的时间用tv 结构体返回,当地时区的信息则放到tz所指的结构中

4.结构体:

1>timeval

struct  timeval{

   

       long  tv_sec;/*秒*/

       long  tv_usec;/*微妙*/

};

2>timezone 结构定义为:

struct  timezone{

        int tz_minuteswest;/*和greenwich 时间差了多少分钟*/

        int tz_dsttime;/*type of DST correction*/

}

3>在gettimeofday()函数中tv或者tz都可以为空。如果为空则就不返回其对应的结构体。

4>函数执行成功后返回0,失败后返回-1,错误代码存于errno中。

5.程序实例:

#include<stdio.h>
#include<sys/time.h>

#include<unistd.h>

 

int main()

{

        struct  timeval    tv;

        struct  timezone   tz;

        gettimeofday(&tv,&tz);

 

        printf(“tv_sec:%d\n”,tv.tv_sec);

        printf(“tv_usec:%d\n”,tv.tv_usec);

        printf(“tz_minuteswest:%d\n”,tz.tz_minuteswest);

        printf(“tz_dsttime:%d\n”,tz.tz_dsttime);

}

说明:在使用gettimeofday()函数时,第二个参数一般都为空,因为我们一般都只是为了获得当前时间,而不用获得timezone的数值

二.gettimeofday()函数的一个常用方法

在测试程序时,往往需要了解程序执行所需的时间,在Linux中可以使用函数gettimeofday来得到时间.

1.程序实例:

测试调用delya()函数所需执行的时间(单位为微妙)

#include<stdio.h>

#include<sys/time.h>

#include<unistd.h>

 

int delay(int time)

{

    int i,j;

   

    for(i =0;i<time;i++)

        for(j=0;j<5000;j++)

            ;

}

 

int main()

{

        struct  timeval start;

        struct  timeval end;

       

        unsigned  long diff;

        gettimeofday(&start,NULL);

        delay(10);

        gettimeofday(&end,NULL);

diff = 1000000 * (end.tv_sec-start.tv_sec)+ end.tv_usec-start.tv_usec;

        printf(“thedifference is %ld\n”,diff);

        return 0;

       

}

说明:

使用该方法就可以检测出调用delay()函数所使用的时间

C语言中可以使用函数gettimeofday()函数来得到时间。它的精度可以达到微妙


clock()

clock()的精度不是很高

   clock_t clock( void );

          clock()函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock),其中clock_t实际上是长整型。在time.h文件中,还定义了一个常量CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元:#define CLOCKS_PER_SEC ((clock_t)1000)。可以使用公式clock()/CLOCKS_PER_SEC来计算一个进程自身的运行时间,eg:

printf("Elapsed time:%u secs.\n", clock()/CLOCKS_PER_SEC);

    以上C/C++下的时间函数需包含time.h头文件

 计时 C/C++中的计时函数是clock(),而与其相关的数据类型是clock_t。在MSDN中,查得对clock函数
    定义如下: clock_t clock( void ); 这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时
    之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wall-clock)。其中clock_t是用来
    保存时间的数据类型,在time.h文件中,我们可以找到对它的定义:
    #ifndef _CLOCK_T_DEFINED typedef long clock_t;
    #define _CLOCK_T_DEFINED 
    #endif 
    很明显,clock_t是一个长整形数。
    在time.h文件中,还定义了一个常量CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元,
    其定义如下:
    #define CLOCKS_PER_SEC ((clock_t)1000)
    可以看到可以看到每过千分之一秒(1毫秒),
    调用clock()函数返回的值就加1。
    下面举个例子,你可以使用公式 clock()/CLOCKS_PER_SEC来计算一个进程自身的运行时间: 
    void elapsed_time()
    { 
    printf("Elapsed time:%u secs./n",clock()/CLOCKS_PER_SEC);
    } 
    当然,你也可以用clock函数来计算你的机器运行一个循环或者处理其它事件到底花了多少时间:
    #i nclude “stdio.h” 
    #i nclude “stdlib.h” 
    #i nclude “time.h” 
    int main( void ) {
    long i = 10000000L; 
    clock_t start, finish; 
    double duration;
    printf( "Time to do %ld empty loops is ", i );
    start = clock(); while( i-- ) ; 
    finish = clock();
    duration = (double)(finish - start) / CLOCKS_PER_SEC;
    printf( "%f seconds/n", duration ); 
    system("pause"); 
    } 
    在笔者的机器上,运行结果如下:
    Time to do 10000000 empty loops is 0.03000 seconds 
    上面我们看到时钟计时单元的长度为1毫秒,那么计时的精度也为1毫秒,
    那么我们可不可以通过改变CLOCKS_PER_SEC的定义,通过把它定义的大一些,
    从而使计时精度更高呢?
    通过尝试,你会发现这样是不行的。
    在标准C/C++中,最小的计时单位是一毫秒。


阅读更多
个人分类: 编程基础
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭