【问题标题】:Different behaviour of system_clock on windows and linuxWindows 和 linux 上 system_clock 的不同行为
【发布时间】:2019-03-12 11:39:36
【问题描述】:

对于给定的程序,与 linux 机器(gcc 4.8)相比,我在 Windows(VS 17)上得到不同的结果。

#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 的情况。

【问题讨论】:

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


【解决方案1】:

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 上具有微秒精度。

您可以通过查看system_clock::duration::period::numsystem_clock::duration::period::den 在不使用date.h header 的情况下检查精度,它们是分数的分子和分母,指定每个刻度表示的以秒为单位的长度(1 和 10' 000'000 在 Windows 上)。

现在可以在 C++20 规范中使用以单位打印持续时间的功能(如 date.h 允许)。

【讨论】:

  • system_clock::time-point 的精度不能跨平台移植。为什么?
  • &lt;chrono&gt; 的设计使得您可以充分利用您的计时硬件,而不必欺骗您(宣传比它所能提供的更精细的精度),并且无需使用写入最低公分母的 API(使用比它可以提供的更粗略的精度)。 &lt;chrono&gt; 供应商可以提供他们认为对给定平台的客户最有用的任何精度。客户可以利用&lt;chrono&gt; 提供的任何(可发现的)精度,或者轻松转换为他们想要的任何方便的精度。
  • 此外,更精细的精度并不是免费的。共有三个调谐旋钮:尺寸、范围和精度。您可以拥有任何两个,但要以第三个为代价。 system_clock::time_point 的大小通常固定为 64 位(不一定是这样,但这在当今的硬件上是可行的)。考虑到尺寸、精度和范围相互牺牲。纳秒 -> +/- 292 年。 100ns -> +/-29200 年。微秒 -> +/-29.2 万年。
猜你喜欢
  • 1970-01-01
  • 2021-04-26
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多