首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >system_clock在windows和linux上的不同行为

system_clock在windows和linux上的不同行为
EN

Stack Overflow用户
提问于 2019-03-12 11:39:36
回答 1查看 816关注 0票数 2

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

代码语言:javascript
复制
#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 542542

如果您看到最后一列,您将观察到差异。但high_resolution_clock的情况并非如此。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-12 14:57:51

system_clock::time-point的精度不能跨平台移植。但是,我们可以很容易地检查它,并/或将其转换为已知的精度,就像您在问题中所做的那样。

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

代码语言:javascript
复制
#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,这将产生如下的结果:

代码语言:javascript
复制
1730ns

在Windows上:

代码语言:javascript
复制
17[1/10000000]s

在macOS上:

代码语言:javascript
复制
1µs

解释:

在gcc上,system_clock::time_point有纳秒精度,在Windows上有精度1/10'000'000 (100 and ),在macOS上有微秒精度。

您可以在不使用date.h头的情况下检查精度,方法是查看system_clock::duration::period::numsystem_clock::duration::period::den,它们是一个分数的分子和分母,该分数指定每个滴答代表的分数秒的长度(在Windows上代表1和10,000‘000)。

现在,C++20规范中已经有了打印其单位(如C++20允许的)持续时间的能力。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55120594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档