
这是简单的性能基准测试:
#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元组表现所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)