目录
linux上使用gettimeofday
windows上使用QueryPerformanceCounter和QueryPerformanceFrequency
具体代码
使用
gettimeofday
是一个函数,用于获取当前时间(从1970年1月1日到现在的秒数和微秒数)。它通常用于需要精确计时的程序中,例如在测量程序执行时间或网络应用程序中调整时间差时。
在C语言中,您可以通过包含
头文件来使用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函数,您可以获取当前时间的秒数和微秒数,并进行相应的计算和操作。
BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount);
QueryPerformanceCounter
和QueryPerformanceFrequency
是Windows编程中使用的两个函数,用于获取高性能计数器的值和频率。
QueryPerformanceCounter
函数用于获取当前的高性能计数器值。它接受一个LARGE_INTEGER
类型的指针作为参数,并将高性能计数器的当前值存储在该指针指向的内存位置中。
QueryPerformanceFrequency
函数用于获取高性能计数器的频率。它也接受一个LARGE_INTEGER
类型的指针作为参数,并将高性能计数器的频率存储在该指针指向的内存位置中。
这两个函数通常一起使用,以计算时间间隔或程序执行时间。首先,通过调用QueryPerformanceFrequency
函数获取高性能计数器的频率。然后,在需要计时的代码段中,调用QueryPerformanceCounter
函数获取开始时间和结束时间,并计算它们之间的时间差。
由于高性能计数器的值和频率是硬件相关的,因此这些函数的使用需要计算机硬件的支持。如果计算机不支持高性能计数器,则这些函数可能无法正常工作。
需要注意的是,由于高性能计数器的精度可能会受到许多因素的影响,包括硬件和操作系统等,因此它的精确度可能无法达到纳米级别。在某些情况下,可能存在一些误差。因此,尽管这些函数可以提供相对精确的时间计算,但并不保证绝对精确。
LARGE_INTEGER
是Windows编程中的一个结构体,用于表示有符号的64位整数。LARGE_INTEGER
结构体包含两个成员变量,LowPart
和HighPart
。其中,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
#else
#include
#endif
#include
#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;
}
}