C/C++ 获取时间间隔的方法

原创 2012年03月28日 23:57:21

clock函数方式

Linux平台下C/C++中获取时间间隔的方法,一种比较普遍的认识是采用clock函数

clock_t clock ( void );

Returns the number of clock ticks elapsed since the program was launched.

The macro constant expression CLOCKS_PER_SEC specifies the relation between a clock tick and a second (clock ticks per second).

The initial moment of reference used by clock as the beginning of the program execution may vary between platforms. To calculate the actual processing times of a program, the value returned by clock should be compared to a value returned by an initial call to clock.

通过两次调用clock函数可以得到起始时间和结束时间,从而得到毫秒级的时间差


gettimeofday函数方式

C/C++语言中有个timeval结构是可以精确到毫秒,可以利用timeval来记录起始时间和结束时间

           struct timeval {
               time_t      tv_sec;     /* seconds */
               suseconds_t tv_usec;    /* microseconds */
           };

通过调用gettimeofday函数可以得到用timeval结构记录的当前时间

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


clock_gettime函数方式

int clock_gettime(clockid_t clk_id, struct timespec *tp);

       The  functions  clock_gettime() retrieve the time of the specified clock clk_id.

       The clk_id argument is the identifier of the particular clock on
       which to act.  A clock may be system-wide and hence visible  for
       all  processes, or per-process if it measures time only within a
       single process.

       All implementations support  the  system-wide  real-time  clock,
       which is identified by CLOCK_REALTIME.  Its time represents sec‐
       onds and nanoseconds since the Epoch.  When its time is changed,
       timers for a relative interval are unaffected, but timers for an
       absolute point in time are affected.

       More clocks may be implemented.  The interpretation of the  cor‐
       responding time values and the effect on timers is unspecified.

       Sufficiently  recent versions of glibc and the Linux kernel sup‐
       port the following clocks:

       CLOCK_REALTIME
              System-wide real-time clock.  Setting this clock requires
              appropriate privileges.

       CLOCK_MONOTONIC
              Clock  that  cannot  be set and represents monotonic time
              since some unspecified starting point.

       CLOCK_MONOTONIC_RAW (since Linux 2.6.28; Linux-specific)
              Similar to CLOCK_MONOTONIC, but provides access to a  raw
              hardware-based  time  that  is not subject to NTP adjust‐
              ments.

       CLOCK_PROCESS_CPUTIME_ID
              High-resolution per-process timer from the CPU.

       CLOCK_THREAD_CPUTIME_ID
              Thread-specific CPU-time clock.


具体实现

#include <time.h>

#include <sys/time.h>

class ClockTool
{
    public:
    ClockTool()
        : m_begin(0), m_end(0)
    {
    }


    inline void begin()
    {
        m_begin = clock();
    }


    inline void end()
    {
        m_end = clock();
    }


    inline void reset()
    {
        m_begin = 0;
        m_end = 0;
    }


    float getInterval()
    {
        if (m_end < m_begin)
        {
            return 0;
        }
        return (double)(m_end - m_begin)/CLOCKS_PER_SEC;
    }


    private:
    clock_t m_begin;
    clock_t m_end;
};


测试执行效率

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

class TimeTool
{
public:
    TimeTool()
    {
        reset();
    }

    inline void begin()
    {
        gettimeofday(&m_begin, NULL);
    }

    inline void end()
    {
        gettimeofday(&m_end, NULL);
    }

    inline void reset()
    {
        memset(&m_begin, 0, sizeof(struct timeval));
        memset(&m_end, 0, sizeof(struct timeval));
    }

    float getInterval()
    {
        if (m_end.tv_usec < m_begin.tv_usec)
        {
            m_end.tv_usec += 1000;
            m_end.tv_sec = m_end.tv_sec - 1;
        }

        return (m_end.tv_sec - m_begin.tv_sec) + (m_end.tv_usec - m_begin.tv_usec) / 1000000.0;
    }

private:
    struct timeval m_begin;
    struct timeval m_end;
};

int main(int argc, char** argv)
{
    const int iLoop = 100000000;

    TimeTool tool;
    tool.begin();
    struct timeval stick0;
    for (int i = 0; i < iLoop; ++i)
    {
        gettimeofday(&stick0, NULL);
    }
    tool.end();
    printf("gettimeofday cost %f\n", tool.getInterval());

    tool.reset();

    tool.begin();
    clock_t stick1= 0;
    for (int i = 0; i < iLoop; ++i)
    {
        stick1 = clock();
    }
    tool.end();
    printf("clock cost %f\n", tool.getInterval());

    tool.reset();

    tool.begin();
    struct timespec stick2;
    for (int i = 0; i < iLoop; ++i)
    {
        clock_gettime(CLOCK_MONOTONIC, &stick2);
    }
    tool.end();
    printf("clock_gettime cost %f\n", tool.getInterval());
}

执行测试可以发现gettimeofday函数的执行效率远高于clock函数

注:发现该测试结论和环境有些相关,有时候gettimeofday cost需要近1分钟,有时候却只需要2秒左右(只是重启了一下机器)

$ g++ -O2 t.cpp -lrt
$ ./a.out
gettimeofday cost 2.288930
clock cost 20.730558
clock_gettime cost 2.097753
$ ./a.out
gettimeofday cost 1.291197
clock cost 20.868483
clock_gettime cost 2.111481
$ ./a.out
gettimeofday cost 2.303097
clock cost 20.924046

clock_gettime cost 1.121241


PS: 在libevent的gettime函数中有用到clock_gettime或者gettimeofday方式(通过宏和标志位来决定采用哪一个)

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

用C实现计算时间间隔的方法

#include /*时间间隔,win32下为毫秒,DOS下为1/18秒(有点低)*/ long GetTickCount() { long ret; ret=peek(0x0,0x46e)...

linux下c/c++实例之六时间测试和定时器

Linux中使用sleep会导致程序一直阻塞,无法交互,同时sleep和usleep有时也不精确,在此总结linux下的部分时间操作。

Linux C++ 时间与日期

linux下存储时间常见的有两种存储方式,一个是从1970年到现在经过了多少秒,一个是用一个结构来分别存储年月日时分秒的。 time_t 这种类型就是用来存储从1970年到现在经过了多少秒,要想更精...
  • qcghdy
  • qcghdy
  • 2014-09-04 19:17
  • 3606

C++中时间延迟的几种方法

从论坛上转来的: (—)使用_sleep()函数  #include    using   namespace   std;  _sleep(5*1000);//延时5秒  ...
  • heycwn
  • heycwn
  • 2016-04-14 11:14
  • 1433

c/c++在windows下获取时间和计算时间差的几种方法总结

一、标准C和C++都可用1、获取时间用time_t time( time_t * timer ),计算时间差使用double difftime( time_t timer1, time_t timer...

C++ 时间间隔

#include #include using namespace std; int main() { clock_t s,e; s=clock(); for(int i=0; i< 10...

在C/C++程序中得到精确时间间隔的方法

在 C/C++ 程序中常用 time( ) 来获取系统时间,但它是以秒为单位的,一需要小于1秒的时间间隔或者精度高于1秒的时间时就不再适用。 此时可以利用一种直接利用Pentium CPU内部时间戳...

c/c++下时间函数总结

time_t time(time_t * timer); time()函数通过返回值或参数获得当前日历时间(从1970年1月1日0时0分0秒到现在经过的秒数),time_t实际上是一个长整型。 st...

java 计算两个时间之间的间隔

1. 怎样计算两个时间之间的间隔? 间隔=Date1.getTime()-Date2.getTime();得出来的是毫秒数. 除1000是秒,再除60是分,再除60是小时............

性能测试的时间间隔获取方法

性能测试的时候,一个问题就是时间间隔,有很多时间函数能获取时间,从而求取时间间隔。关于这方面的文章很多,我就不重复了,这里只是提供一些基本的信息,从而方便我自己做性能测试使用: (1)C语言时间函数...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)