有没有更准确的方法来记录C ++中的时间?

时间:2019-12-05 02:42:21

标签: python c++ timer

我用C ++和Python编写了两个计时器,发现与Python相比,C ++不太准确。
这是C ++的代码:

#include <chrono>
#include <iomanip> // setprecision
#include <iostream>

using namespace std;

// from: https://stackoverflow.com/a/1658429/6611263
#ifdef _WIN32
    #include <windows.h>

    void sleep(unsigned milliseconds)
    {
        Sleep(milliseconds);
    }
#else
    #include <unistd.h>

    void sleep(unsigned milliseconds)
    {
        usleep(milliseconds * 1000); // takes microseconds
    }
#endif

// from: https://stackoverflow.com/a/29560999/6611263
double time()
{
    double fractional_seconds_since_epoch
        = std::chrono::duration_cast<std::chrono::duration<double>>(
            std::chrono::system_clock::now().time_since_epoch()).count();
    return fractional_seconds_since_epoch;
}

void test_timer()
{
    double t0 = time();
    for (int i=0; i<10; i++)
    {
        sleep(1000);
        double duration = time() - t0;
        cout << "duration: " << fixed << setprecision(4) << duration << "s\n";
    }
}

int main()
{
    test_timer();
    return 0;
}

C ++的结果在这里:

duration: 1.0014s
duration: 2.0038s
duration: 3.0072s
duration: 4.0096s
duration: 5.0119s
duration: 6.0143s
duration: 7.0167s
duration: 8.0191s
duration: 9.0205s
duration: 10.0219s

Python的代码在这里:

import time

def test_timer():
    t0 = time.time()
    for i in range(10):
        time.sleep(1)
        duration = time.time() - t0
        print("duration: {:.4f}s".format(duration))
        pass
    pass

def main():
    test_timer()
    pass

if __name__ == '__main__':
    main()
    pass

Python的结果在这里:

duration: 1.0004s
duration: 2.0008s
duration: 3.0012s
duration: 4.0016s
duration: 5.0019s
duration: 6.0023s
duration: 7.0027s
duration: 8.0031s
duration: 9.0035s
duration: 10.0039s

那么有什么方法可以在C ++中更准确地记录时间?谢谢你。
N.B.环境:WIN 10 x64,C ++ 17,Python 3.7

2 个答案:

答案 0 :(得分:4)

  

那么有什么方法可以在C ++中更准确地记录时间?

是的。使用std::this_thread::sleep_until代替sleep

通过在一个时间点之前睡眠 ,而不是持续一个时间 ,您不再在每次迭代中积累循环开销。仍然会有一些误差,但是这种误差不会增加。

下面,我演示如何执行此操作。另外,我还将展示如何保持类型安全的<chrono>类型系统中,直到打印duration的最后一点:

#include <chrono>
#include <iomanip> // setprecision
#include <iostream>
#include <thread>

using namespace std;

void test_timer()
{
    auto next = 0s;
    auto t0 = chrono::system_clock::now();
    for (int i=0; i<10; i++)
    {
        this_thread::sleep_until(t0 + ++next);
        chrono::duration<double> duration = chrono::system_clock::now() - t0;
        cout << "duration: " << fixed << setprecision(4) << duration.count() << "s\n";
    }
}

int main()
{
    test_timer();
}

对我来说,这只是输出:

duration: 1.0017s
duration: 2.0009s
duration: 3.0040s
duration: 4.0007s
duration: 5.0010s
duration: 6.0015s
duration: 7.0008s
duration: 8.0030s
duration: 9.0012s
duration: 10.0032s

答案 1 :(得分:0)

首先提到的std::this_thread::sleep_for并不适合测试时间测量;

  

由于调度或资源争用延迟,此功能可能阻塞的时间比sleep_duration长。

我也建议使用std::chrono::high_resolution_clock

代替std::chrono::system_clock