3 回答
TA贡献1890条经验 获得超9个赞
我猜你正在使用VS2012;如果不是,请忽略此答案。VS2012 typedef的high_resolution_clock到system_clock。可悲的是,这意味着它的精度很差(大约1毫秒)。我写了一个更好的高分辨率时钟,QueryPerformanceCounter用于VS2012。
HighResClock.h:
struct HighResClock
{
typedef long long rep;
typedef std::nano period;
typedef std::chrono::duration<rep, period> duration;
typedef std::chrono::time_point<HighResClock> time_point;
static const bool is_steady = true;
static time_point now();
};
HighResClock.cpp:
namespace
{
const long long g_Frequency = []() -> long long
{
LARGE_INTEGER frequency;
QueryPerformanceFrequency(&frequency);
return frequency.QuadPart;
}();
}
HighResClock::time_point HighResClock::now()
{
LARGE_INTEGER count;
QueryPerformanceCounter(&count);
return time_point(duration(count.QuadPart * static_cast<rep>(period::den) / g_Frequency));
}
(我省略了一个断言和#ifs来查看上面的代码是否在2012年对其进行了编译)
您可以在任何地方以与标准时钟相同的方式使用此时钟。
TA贡献1824条经验 获得超6个赞
时钟的分辨率不一定与可由时钟使用的数据类型表示的最小持续时间相同。在这种情况下,您的实现使用的数据类型可以表示持续时间仅为100纳秒,但是底层时钟实际上没有这样的分辨率。
high_resolution_clock多年来,Visual Studio的低分辨率一直是一个问题。微软的C ++标准库维护者Stephan T. Lavavej 表示,这已在VS2015中通过使用进行了修复QueryPerformanceCounter()。
TA贡献1836条经验 获得超13个赞
也许实现未实现更高分辨率的计时器?
似乎您正在使用Windows(提到C#),因此,如果您使用计时器,并且确实在使用Windows,则可以使用QueryPerformanceFrequency和QueryPerformanceCounter。
- 3 回答
- 0 关注
- 952 浏览
添加回答
举报