我用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
答案 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