是否有更准确的方式记录C++中的时间? 我在C++和Python中编写了两个定时器,并发现C++与Python相比并不十分精确。 以下是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++中的时间? 我在C++和Python中编写了两个定时器,并发现C++与Python相比并不十分精确。 以下是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; },python,c++,timer,Python,C++,Timer,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()

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.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
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++中记录更精确的时间?先谢谢你。 注意环境:Win10x64,C++17,Python3.7,前面提到的std::this_thread::sleep_不适合测试时间测量

由于调度或资源争用延迟,此函数的阻塞时间可能超过睡眠时间

另外,我建议使用std::chrono::system_clock来代替std::chrono::system_clock,因为std::this_thread::sleep_不适合测试时间测量

由于调度或资源争用延迟,此函数的阻塞时间可能超过睡眠时间

另外,我建议使用std::chrono::system_clock来代替std::chrono::system_clock

有没有办法在C++中记录时间更准确?

对。使用std::this_线程::sleep_till代替sleep

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

下面我将展示如何做到这一点。此外,我还展示了如何在打印持续时间的最后一点之前保持在类型安全类型系统中:

有没有办法在C++中记录时间更准确?

对。使用std::this_线程::sleep_till代替sleep

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

下面我将展示如何做到这一点。此外,我还展示了如何在打印持续时间的最后一点之前保持在类型安全类型系统中:


你不仅仅是在测量睡眠时间。您还可以测量所有其他内容,例如:获取当前时间、打印消息。您还可以将时间值存储在数组中,然后在循环完成后打印结果。使用g++9.2,在Linux上,Ryzen Threadripper CPU,我得到:1.0001s、2.0002s、3.0003s、4.0004s等。。。童子军的荣誉!尝试摆脱iostreams,并用printf或std::to_字符替换它。Iostream是众所周知的猪,有很多开销。我试过了,结果确实更好。谢谢大家!@MoppI试过了,结果确实更好,但并不比你的好。也许我的机器不是很有竞争力。谢谢大家!@VarshavchikYou不仅仅是测量睡眠时间。您还可以测量所有其他内容,例如:获取当前时间、打印消息。您还可以将时间值存储在数组中,然后在循环完成后打印结果。使用g++9.2,在Linux上,Ryzen Threadripper CPU,我得到:1.0001s、2.0002s、3.0003s、4.0004s等。。。童子军的荣誉!尝试摆脱iostreams,并用printf或std::to_字符替换它。Iostream是众所周知的猪,有很多开销。我试过了,结果确实更好。谢谢大家!@MoppI试过了,结果确实更好,但并不比你的好。也许我的机器不是很有竞争力。谢谢大家!@瓦沙维奇
#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