跨平台工具精确地计算函数执行时间

目录

linux上使用gettimeofday

windows上使用QueryPerformanceCounter和QueryPerformanceFrequency

具体代码

使用


linux上使用gettimeofday

gettimeofday是一个函数,用于获取当前时间(从1970年1月1日到现在的秒数和微秒数)。它通常用于需要精确计时的程序中,例如在测量程序执行时间或网络应用程序中调整时间差时。

在C语言中,您可以通过包含<sys/time.h>头文件来使用gettimeofday函数。该函数的标准原型如下:

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

其中,tv是一个指向timeval结构的指针,用于存储当前时间值。timezone结构可以用于获取时区信息,但通常在大多数系统中都被忽略,设置为NULL

gettimeofday函数将当前时间以timeval结构的形式返回,其中包含秒数和微秒数。该结构的定义如下:

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

通过使用gettimeofday函数,您可以获取当前时间的秒数和微秒数,并进行相应的计算和操作。

windows上使用QueryPerformanceCounter和QueryPerformanceFrequency

BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount);

QueryPerformanceCounterQueryPerformanceFrequency是Windows编程中使用的两个函数,用于获取高性能计数器的值和频率。

QueryPerformanceCounter函数用于获取当前的高性能计数器值。它接受一个LARGE_INTEGER类型的指针作为参数,并将高性能计数器的当前值存储在该指针指向的内存位置中。

QueryPerformanceFrequency函数用于获取高性能计数器的频率。它也接受一个LARGE_INTEGER类型的指针作为参数,并将高性能计数器的频率存储在该指针指向的内存位置中。

这两个函数通常一起使用,以计算时间间隔或程序执行时间。首先,通过调用QueryPerformanceFrequency函数获取高性能计数器的频率。然后,在需要计时的代码段中,调用QueryPerformanceCounter函数获取开始时间和结束时间,并计算它们之间的时间差。

由于高性能计数器的值和频率是硬件相关的,因此这些函数的使用需要计算机硬件的支持。如果计算机不支持高性能计数器,则这些函数可能无法正常工作。

需要注意的是,由于高性能计数器的精度可能会受到许多因素的影响,包括硬件和操作系统等,因此它的精确度可能无法达到纳米级别。在某些情况下,可能存在一些误差。因此,尽管这些函数可以提供相对精确的时间计算,但并不保证绝对精确。

  • LARGE_INTERGER 介绍
    LARGE_INTEGER是Windows编程中的一个结构体,用于表示有符号的64位整数。
    LARGE_INTEGER结构体包含两个成员变量,LowPartHighPart。其中,LowPart表示整数的低32位,而HighPart表示整数的高32位。通过这两个成员变量,可以完整地表示一个64位整数。
    除了用于表示整数外,LARGE_INTERGER结构体还可以与其他函数结合使用,例如进行位移操作、比较操作等。
    需要注意的是,LARGE_INTERGER类型是Windows编程中的一个特定类型,在其他编程环境中可能具有不同的定义和用法。
    具体结构如下:
#if defined (__WIDL__)
typedef struct _LARGE_INTEGER {
#else
  typedef union _LARGE_INTEGER {
    __C89_NAMELESS struct {
      DWORD LowPart;
      LONG HighPart;
    } DUMMYSTRUCTNAME;
    struct {
      DWORD LowPart;
      LONG HighPart;
    } u;
#endif
    LONGLONG QuadPart;
  } LARGE_INTEGER;

具体代码

#ifdef _WIN32
#include <windows.h>
#else
#include <sys/time.h>
#endif

#include <iostream>

#ifndef _WIN32
class timestramp{
public:
    timestramp()
    {
         gettimeofday(&tpstart,NULL);
    }

    ~timestramp()
    {
         gettimeofday(&tpend,NULL);
         dwTime = 1000000*(tpend.tv_sec- tpstart.tv_sec)+(tpend.tv_usec- tpstart.tv_usec);
         std::cout << "used time:" <<  dwTime << " us" << std::endl;
    }
private:
     struct timeval tpstart,tpend;
     double timeuse;
     unsigned long dwTime;
};

#else

class timestramp{
private:
    LARGE_INTEGER m_litmp;
    LONGLONG QPart2;
    LONGLONG QPart1;
    double dfMinus, dfFreq, dfTim;
    static double m_dTimeCount;
public:
    timestramp(){
        QueryPerformanceFrequency(&m_litmp);
        dfFreq = (double)m_litmp.QuadPart;
        QueryPerformanceCounter(&m_litmp);
        QPart1 = m_litmp.QuadPart;
    }

    ~timestramp(){
        QueryPerformanceCounter(&m_litmp);
        QPart2 = m_litmp.QuadPart; 
        dfMinus = (double)(QPart2 - QPart1);
        dfTim = dfMinus / dfFreq * 1000*1000;

        //显示时间
        std::string msg4 = "time:", msg3, msg5 = " us";
        char strTime[20] = "";
        sprintf(strTime, "%.6lf", dfTim);
        msg3 = strTime;
        msg4 += msg3;
        msg4 += msg5;
        std::cout << msg4.c_str() << std::endl;
    }
};
#endif

使用

int main()
{
    {
        timestramp ti;
        for(int i = 0; i < 1000000; i++){
            //do anything
        }
        return 0;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

telllong

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值