C 11元组表现

C 11元组表现,第1张

概述在包括单个元素在内的很多情况下,我只是想通过使用std :: tuple来使我的代码更加通用化.我的意思是例如元组< double>而不是双倍.但我决定检查这个特例的表现. 这是简单的性能基准测试: #include <tuple>#include <iostream>using std::cout;using std::endl;using std::get;using std::t 在包括单个元素在内的很多情况下,我只是想通过使用std :: tuple来使我的代码更加通用化.我的意思是例如元组< double>而不是双倍.但我决定检查这个特例的表现.

这是简单的性能基准测试:

#include <tuple>#include <iostream>using std::cout;using std::endl;using std::get;using std::tuple;int main(voID){#ifdef TUPLE    using double_t = std::tuple<double>;#else    using double_t = double;#endif    constexpr int count = 1e9;    auto array = new double_t[count];    long long sum = 0;    for (int IDx = 0; IDx < count; ++IDx) {#ifdef TUPLE        sum += get<0>(array[IDx]);#else        sum += array[IDx];#endif    }    delete[] array;    cout << sum << endl; // just "external" sIDe effect for variable sum.}

并运行结果:

$g++ -DTUPLE -O2 -std=c++11 test.cpp && time ./a.out0  real    0m3.347suser    0m2.839ssys     0m0.485s$g++  -O2 -std=c++11 test.cpp && time ./a.out0  real    0m2.963suser    0m2.424ssys     0m0.519s

我认为元组是严格的静态编译模板和所有get<>在这种情况下,函数只是通常的变量访问.此测试中的BTW内存分配大小相同.
为什么会出现执行时间差异?

编辑:问题是在元组的初始化<>宾语.为了使测试更准确,必须更改一行:

constexpr int count = 1e9;-    auto array = new double_t[count];+    auto array = new double_t[count]();     long long sum = 0;

之后,可以观察到类似的结果:

$g++ -DTUPLE -g -O2 -std=c++11 test.cpp && (for i in $(seq 3); do time ./a.out; done) 2>&1 | grep realreal    0m3.342sreal    0m3.339sreal    0m3.343s$g++ -g -O2 -std=c++11 test.cpp && (for i in $(seq 3); do time ./a.out; done) 2>&1 | grep realreal    0m3.349sreal    0m3.339sreal    0m3.334s
解决方法 元组所有默认构造值(因此一切都为0)双精度不会默认初始化.

在生成的程序集中,以下初始化循环仅在使用元组时出现.否则它们是等价的.

.L2:    movq    ,(%rdx)    addq    ,%rdx    cmpq    %rcx,%rdx    jne .L2
总结

以上是内存溢出为你收集整理的C 11元组表现全部内容,希望文章能够帮你解决C 11元组表现所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1243258.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存