Billy根据我完全同意的ISO C ++标准提供了一个很好的答案。然而,故事还有另一面-现实生活。现在看来,在流行的编译器实现中,这些时钟之间确实没有任何区别:
gcc 4.8:
#ifdef _GLIBCXX_USE_CLOCK_MONOTONIC
...
#else
typedef system_clock steady_clock;
#endif
typedef system_clock high_resolution_clock;
Visual Studio 2012:
class steady_clock : public system_clock
{ // wraps monotonic clock
public:
static const bool is_monotonic = true; // retained
static const bool is_steady = true;
};
typedef system_clock high_resolution_clock;
在使用gcc的情况下,您可以通过检查is_steady
并相应地执行操作来检查是否处理稳定的时钟。但是VS2012似乎在这里有点作弊:-)
如果您需要高精度时钟,我建议您现在编写符合C ++ 11官方时钟接口的自己的时钟,并等待实现赶上来。与直接在代码中使用特定于操作系统的API相比,这将是更好的方法。对于Windows,您可以这样:
// Self-made Windows QueryPerformanceCounter based C++11 API compatible clock
struct qpc_clock {
typedef std::chrono::nanoseconds duration; // nanoseconds resolution
typedef duration::rep rep;
typedef duration::period period;
typedef std::chrono::time_point<qpc_clock, duration> time_point;
static bool is_steady; // = true
static time_point now()
{
if(!is_inited) {
init();
is_inited = true;
}
LARGE_INTEGER counter;
QueryPerformanceCounter(&counter);
return time_point(duration(static_cast<rep>((double)counter.QuadPart / frequency.QuadPart *
period::den / period::num)));
}
private:
static bool is_inited; // = false
static LARGE_INTEGER frequency;
static void init()
{
if(QueryPerformanceFrequency(&frequency) == 0)
throw std::logic_error("QueryPerformanceCounter not supported: " + std::to_string(GetLastError()));
}
};
对于Linux,它甚至更容易。只需阅读的手册页clock_gettime
并修改上面的代码即可。