这是经常运行并且必须快速运行的代码,所以我想就最快的实现得到一些意见。请注意,我实际上需要具有一定精度的完整毫秒分辨率(因此 seconds * 1000 是不够的)。对于这个项目,使用 Boost 是可以的。
编辑:目标平台是 x64_86 CentOS5,也希望能够依赖操作系统时钟,这样我也可以在不连续运行的程序中使用它。
C++ 有用于处理时间的 chrono 库:
#include <chrono>
#include <iostream>
#include <ctime>
std::chrono::system_clock::duration duration_since_midnight() {
auto now = std::chrono::system_clock::now();
time_t tnow = std::chrono::system_clock::to_time_t(now);
tm *date = std::localtime(&tnow);
date->tm_hour = 0;
date->tm_min = 0;
date->tm_sec = 0;
auto midnight = std::chrono::system_clock::from_time_t(std::mktime(date));
return now-midnight;
}
int main()
{
auto since_midnight = duration_since_midnight();
auto hours = std::chrono::duration_cast<std::chrono::hours>(since_midnight);
auto minutes = std::chrono::duration_cast<std::chrono::minutes>(since_midnight - hours);
auto seconds = std::chrono::duration_cast<std::chrono::seconds>(since_midnight - hours - minutes);
auto milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(since_midnight - hours - minutes - seconds);
auto microseconds = std::chrono::duration_cast<std::chrono::microseconds>(since_midnight - hours - minutes - seconds - milliseconds);
auto nanoseconds = std::chrono::duration_cast<std::chrono::nanoseconds>(since_midnight - hours - minutes - seconds - milliseconds - microseconds);
std::cout << hours.count() << "h ";
std::cout << minutes.count() << "m ";
std::cout << seconds.count() << "s ";
std::cout << milliseconds.count() << "ms ";
std::cout << microseconds.count() << "us ";
std::cout << nanoseconds.count() << "ns\n";
}
这取决于您的实现,您获得的分辨率究竟是什么。VS 11 beta 声称分辨率为 100ns,虽然我不能说它有多准确。
11h 51m 57s 285ms 699us 600ns
Microsoft 有一篇文章“Implement a Continuously Updating, High-Resolution Time Provider for Windows”详细介绍了如何使用QueryPerformanceCounter
来获得高分辨率时间。
例如,我会尝试创建一个计时器来检查每秒的时间。如果到午夜的时间小于 K 秒:
while(True)
{
if (checkTime() >= MIDNIGHT))
{
break;
}
}