gpt4 book ai didi

python - 在C++中有更准确的时间记录方式吗?

转载 作者:太空宇宙 更新时间:2023-11-04 09:22:56 24 4
gpt4 key购买 nike

我用 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++ 的结果在这里:

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++中有没有更准确记录时间的方法呢?提前谢谢你。
注意环境:WIN 10 x64、C++17、Python 3.7

最佳答案

So is there way to record time more accurate in 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

关于python - 在C++中有更准确的时间记录方式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59187425/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com