c++ - 使用 High_resolution_clock 的时间测量未按预期工作

标签 c++ c++11 c++-chrono

我希望能够用我的时钟类测量耗时(对于帧时间)。 (问题在代码下面描述。)

时钟.h

typedef std::chrono::high_resolution_clock::time_point timePt;

class Clock
{
    timePt currentTime;
    timePt lastTime;

public:
    Clock();

    void update();
    uint64_t deltaTime();

};

时钟.cpp

#include "Clock.h"

using namespace std::chrono;

Clock::Clock()
{
    currentTime = high_resolution_clock::now();
    lastTime = currentTime;
}

void Clock::update()
{
    lastTime = currentTime;
    currentTime = high_resolution_clock::now();
}

uint64_t Clock::deltaTime()
{
    microseconds delta = duration_cast<microseconds>(currentTime - lastTime);
    return delta.count();
}

当我尝试像这样使用时钟时

Clock clock;

while(1) {
    clock.update();
    uint64_t dt = clock.deltaTime();

    for (int i=0; i < 10000; i++)
    {
        //do something to waste time between updates
        int k = i*dt;
    }
    cout << dt << endl; //time elapsed since last update in microseconds
 }

对我来说,它打印了大约 30 次“0”,直到它最终打印出一个总是非常接近“15625”微秒(15.625 毫秒)之类的数字。

我的问题是,为什么两者之间没有任何东西?我想知道我的实现是错误的还是 high_resolution_clock 的精度表现得很奇怪。有什么想法吗?

编辑:我在 Windows 8 计算机上使用 Codeblocks 和 mingw32 编译器。

编辑2: 我尝试运行以下应该显示 high_resolution_clock 精度的代码:

template <class Clock>
void display_precision()
{
    typedef std::chrono::duration<double, std::nano> NS;
    NS ns = typename Clock::duration(1);
    std::cout << ns.count() << " ns\n";
}

int main()
{
    display_precision<std::chrono::high_resolution_clock>();
}

对我来说它打印:“1000 ns”。所以我猜 high_resolution_clock 的精度是 1 微秒吧?然而在我的测试中它似乎有 16 毫秒的精度?

最佳答案

您使用的是什么系统? (我猜是 Windows?已知 Visual Studio 有此问题,现已在 VS 2015 中修复,请参阅 bug report )。在某些系统上,high_resolution_clock 被定义为 system_clock 的别名,它的分辨率可能非常低,比如您看到的 16 毫秒。 例如,参见此 question .

关于c++ - 使用 High_resolution_clock 的时间测量未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31643279/

相关文章:

c++ - C++中使用自动说明符推导纯右值类型时的判别

c++ - 使用 const 对象 move 语义

c++ - std::chrono - 固定时间步长循环

c++ - Qt Directx 渲染

c++ - 如何向 "interrupt"调用一个函数?

c++ - SHGetSpecialFolderPath() 未在此范围内声明

c++ - 如何在C++中从文本文件中删除相似的值并将其分组?

lambda - 如何简化C++0x中lambda繁琐的参数声明?

c++ - 使用 std::chrono 在 C++ 中实现一致的时间戳

c++ - 在模板中有没有办法为每个计时实例只编写一个特化? (纳秒、毫秒、秒等)