2014-10-20 51 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