c++程序计时

本文介绍了一种跨平台获取系统当前时间的高精度方法,适用于Windows和类Unix平台,如Linux、OS-X。在Windows平台上,利用GetSystemTimeAsFileTime函数结合FILETIME结构体实现;在类Unix平台上,则通过gettimeofday函数实现。此方法单位精确到微秒,满足性能要求高的代码优化需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

获取系统当前时

在调试、日志输出、代码优化时,我们常常需要获得系统的时间。在一些性能要求高的代码优化时,对时间的精确度还比较高。在网上找不高质量的代码,便自己研究了一下,代码如下(能满足跨平台的要求,单位精确到微秒):

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


// 定义64位整形
#if defined(_WIN32) && !defined(CYGWIN)
typedef __int64 int64_t;
#else
typedef long long int64t;
#endif  // _WIN32

// 获取系统的当前时间,单位微秒(us)
int64_t GetSysTimeMicros()
{
#ifdef _WIN32
// 从1601年1月1日0:0:0:000到1970年1月1日0:0:0:000的时间(单位100ns)
#define EPOCHFILETIME   (116444736000000000UL)
    FILETIME ft;
    LARGE_INTEGER li;
    int64_t tt = 0;
    GetSystemTimeAsFileTime(&ft);
    li.LowPart = ft.dwLowDateTime;
    li.HighPart = ft.dwHighDateTime;
    // 从1970年1月1日0:0:0:000到现在的微秒数(UTC时间)
    tt = (li.QuadPart - EPOCHFILETIME) /10;
    return tt;
#else
    timeval tv;
    gettimeofday(&tv, 0);
    return (int64_t)tv.tv_sec * 1000000 + (int64_t)tv.tv_usec;
#endif // _WIN32
    return 0;
}

代码说明

在类Unix平台(Linux、OS-X)使用gettimeofday方法,这个简单,没什么好说,自己看代码。在Windows平台使用GetSystemTimeAsFileTime方法,这个需解释一下。

GetSystemTimeAsFileTime的输出参数是LPFILETIME,其结构如下:

typedef struct _FILETIME {
   DWORD dwLowDateTime;
   DWORD dwHighDateTime; 
} FILETIME, *PFILETIME;

这个结构可表示为一个64位的数值,两个成为分别代码低32位和高32位,代表1601年1月1日开始到现在的计数器,计数间隔为100纳秒。 

li.LowPart = ft.dwLowDateTime;
li.HighPart = ft.dwHighDateTime;

是将结构体转换成64位整形LARGE_INTEGER::QuadPart。 
#define EPOCHFILETIME (116444736000000000UL)表示从1601年1月1日0:0:0:000到1970年1月1日0:0:0:000的时间(单位100ns)。

C++中进行程序计时可以使用`<chrono>`头文件中的`high_resolution_clock`和`time_point`来实现。具体实现步骤如下: 1. 在程序开始前,定义一个`time_point`类型的变量`start_time`和`end_time`。 2. 在程序执行需要计时的代码前,通过`high_resolution_clock::now()`获取当前时间,并将其赋值给`start_time`。 3. 在程序执行完需要计时的代码后,再次通过`high_resolution_clock::now()`获取当前时间,并将其赋值给`end_time`。 4. 计算程序执行时间,可以使用`duration_cast`函数将时间差转换为秒、毫秒、微秒等。 下面是一个示例代码: ```c++ #include <iostream> #include <chrono> using namespace std; using namespace std::chrono; int main() { // 定义两个时间点 time_point<high_resolution_clock> start_time, end_time; // 获取当前时间并赋值给start_time start_time = high_resolution_clock::now(); // 执行需要计时的代码 for (int i = 0; i < 100000000; i++) { int j = i * 2; } // 获取当前时间并赋值给end_time end_time = high_resolution_clock::now(); // 计算程序执行时间并输出 auto duration = duration_cast<milliseconds>(end_time - start_time); cout << "程序执行时间:" << duration.count() << "毫秒" << endl; return 0; } ``` 上述代码中,我们使用`high_resolution_clock`获取当前时间,并将其赋值给`start_time`和`end_time`,然后计算时间差并输出。注意,我们使用`duration_cast`将时间差转换为毫秒,并使用`count()`方法获取时间差的数值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值