Windows和Linux上system_clock的不同行为

时间:2019-03-12 11:39:37

标签: c++11 visual-c++ cross-platform chrono

对于给定的程序,我在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情况下不会。

1 个答案:

答案 0 :(得分:0)

transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,)) ]) 精度不能跨平台移植。但是您可以轻松地对其进行检查,和/或将其转换为已知的精度。

最简单的检查方法是使用我的date.h header

system_clock::time-point

在gcc上,它将输出如下内容:

#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';
}

在Windows上:

1730ns

在macOS上:

17[1/10000000]s

说明:

在gcc上,1µs 的精度为纳秒,在Windows上,精度为system_clock::time_point(100ns),而在macOS上,精度为微秒。

您可以通过查看1/10'000'000system_clock::duration::period::num来检查精度,而无需使用date.h headersystem_clock::duration::period::denbeta是小数的分子和分母,用于指定每个刻度的秒数长度代表(在Windows上为1和10'000'000)。

当前可以在C ++ 20草案规范中使用其单位打印持续时间的功能(例如date.h)。