2014-10-20 63 views
0

我想在我的程序std::array更换std::vector,所以我去测试:的std ::阵VS C-阵列VS STD:向量

template<typename T> class A{ 
    public: 
    void sub_run(T w){ 
     w[0] = 0.5; 
     w[1] = 1.5; 
     w[2] = 2.5; 
     w[3] = 0.0; 

     for (int i = 0; i < 100000000; i++) 
     { 
      w[0] = i *0.5; 
      w[1] = i *1.5; 
      w[2] = i *2.5; 

      w[3] = w[0] + w[1]*w[2]; 
     } 
    } 
}; 

int main(){ 

    // Vectors  
    /* 
    A<vector<double> > inst_a; 
    vector<double> w(4); 
    inst_a.sub_run(w); 
    */ 
    // 1.71 sec 

    // C-array 
    /* 
    A<double *> inst_a; 
    double w[4]; 
    inst_a.sub_run(w); 
    */ 
    // 1.03 sec 

    // std::array 

    A<array<double,4> > inst_a; 
    array<double,4> w; 
    inst_a.sub_run(w); 

    // 3.31 sec 

    return 0; 
} 

好,产量奇不够的 - 在std::array是比C阵列慢3倍,甚至比vector慢。没有应用优化,唯一的标志是-std=c++11。 什么可能是错的?

+5

*未应用优化,唯一的标志是-std = C++ 11。什么可能是错的?*。你有没有检查何时应用优化?未优化的C++没有试图以任何形式或形式击败“类C”的性能,因此如果您要讨论最终产品的性能,您必须允许C++编译器进行优化......因为否则,它会留下很多帮助调试/等的东西。不公平的比较。 – HostileFork 2014-10-20 11:49:59

+5

“没有应用优化”正是错误的。 – 2014-10-20 11:50:28

+0

“”没有应用优化“正是错误。” - 这在某种程度上是不明显的,因为cppreference.com只是说“......将C风格数组的性能和可访问性与标准容器的优点相结合,比如了解它自己的大小,支持分配,随机访问迭代器等“。 – stkubr 2014-10-20 11:59:28

回答

3

从GCC documentation about Optimization

不使用任何优化选项,编译器的目标是降低编译 成本,使调试产生期望的结果 。语句是独立的:如果用户在语句之间断点处停止程序,则可以为任何 变量赋值新的值,或者将程序计数器更改为 函数中的任何其他语句,并准确获得您期望从源中获得的结果码。

没有-O选项,GCC不关心性能。它关心使用gdb或其他类似工具进行调试。要实际编译运行尽可能快的程序,应使用-O选项。例如,-O2