对于给定的程序,我在Windows(VS 17)上获得的结果与linux机器(gcc 4.8)不同。
#include "CrossDevelopment.h"
using namespace std;
int main()
{
for (auto i = 0; i < 3; i++)
{
//chrono::high_resolution_clock::time_point start_time = chrono::high_resolution_clock::now();
chrono::system_clock::time_point start_time = chrono::system_clock::now();
for (auto i = 0; i < 50; i++) {
int a = 10;
int b = 5;
int c = a + b;
c += 10;
c *= a;
a *= b;
}
//chrono::high_resolution_clock::time_point end_time = chrono::high_resolution_clock::now();
chrono::system_clock::time_point end_time = chrono::system_clock::now();
auto elapsed_time = chrono::duration<double, micro>(end_time - start_time);
cout << "Difference of time " << elapsed_time.count() << " " << (end_time - start_time).count()
<< " " << (chrono::duration_cast<chrono::nanoseconds>(end_time - start_time)).count() << endl;
}
getchar();
return 0;
}
输出在Windows机器上
时间差1 10 1000
时差的差异0.7 7 700
时差的差异0.7 7 700
在Linux机器上
时差0.806 806 806
时差0.6 600 600
时间差0.542 542 542
如果您看到最后一列,您将发现差异。哪个不是high_resolution_clock。
system_clock::time-point
的精度不能跨平台移植。但是,您可以轻松地检查它,和/或将其转换为已知的精度,就像您在问题中所做的那样。
检查它的最简单方法是使用我的date.h header:
#include "date/date.h"
#include <iostream>
int
main()
{
using namespace std;
using namespace std::chrono;
using date::operator<<;
auto start_time = system_clock::now();
auto end_time = system_clock::now();
cout << end_time - start_time << '\n';
}
在gcc上,这将输出如下内容:
1730ns
在Windows上:
17[1/10000000]s
在macOS上:
1µs
说明:
在gcc上,system_clock::time_point
具有纳秒精度,在Windows上,它具有精确的1/10'000'000
(100ns),并且在macOS上,精度为微秒。
您可以通过查看date.h header和system_clock::duration::period::num
来检查精度而不需要system_clock::duration::period::den
,date.h和qazxswpoi是一个分数的分子和分母,它指定每个刻度表示的分数的长度(在Windows上为1和10'000'000)。
使用单位打印持续时间的能力(如qazxswpoi允许)目前在C ++ 20草案规范中。