2017-07-10 92 views
0

這個問題不是關於通過值或引用傳遞大對象 - 也不是移動語義 - 就像許多其他問題一樣。C++ 11通過POD類型值比const引用更差

我想知道POD類型有多小,以便通過值而不是const引用傳遞它是一個更好的想法。我寫了下面的代碼:

#include <ctime> 
#include <iostream> 
#include <complex> 

using namespace std; 

using Number = double; //complex<double>; 

struct acc { 
    Number a; 
    void f(const Number& x) { a += x; } 
    void g(Number x) { a += x; } 
}; 

int main() 
{ 
    int n = 1000000000; 
    Number *v = new Number[n]; 

    for (int i = 0; i < n; i++) { 
    v[i] = Number(i); 
    } 

    clock_t b, e; 
    acc foo; 

#ifdef _const 
    b = clock(); 
    for (int i = 0; i < n; i++) 
    foo.f(v[i]); 

    e = clock(); 

    cout << ((double) e - b)/CLOCKS_PER_SEC << endl; 
#else 
    b = clock(); 
    for (int i = 0; i < n; i++) 
    foo.g(v[i]); 

    e = clock(); 

    cout << ((double) e - b)/CLOCKS_PER_SEC << endl; 
#endif 

    cout << foo.a << endl; 

    return 0; 
} 

我用gcc編譯沒有優化。

當使用Number = complex時,const引用速度更快,而且我期待這一點。但是當使用Number = double時,通過const引用的速度也會更快,這對我來說是完全令人驚訝的(在我的計算機中,傳遞值爲3.5,const引用爲2.9)。

這是爲什麼?在這樣一個簡單的例子中,包括內存訪問在內的工作量是不是相同?我必須編寫一個模板庫,並且我想要小心並根據模板參數的大小使用const引用或傳遞值,但現在我認爲這樣做是沒用的。其他人有什麼想法是怎麼回事?

如果我編譯優化,那麼兩個品種運行同樣快。

+15

「*我用gcc編譯沒有優化。*」這是問題所在。不值得花費太多時間來擔心未優化代碼的相對性能。 – juanchopanza

+1

「如果我通過優化進行編譯,那麼這兩個品種的運行速度都是相同的。」 那麼你想要什麼? – DaOnlyOwner

+2

我投票結束這個問題,因爲它沒有問任何明顯的問題。 –

回答

3

編譯器編寫者不關心你的未優化玩具代碼在一個類似的情況下比另一個類似的情況慢了20%。這就是爲什麼。

你也不應該,除非你處於一個極端的情況下,你需要你的調試版本足夠快以達到一些軟實時要求(比如,每XHz完成一次渲染,或者在數據的另一端之前處理數據網絡連接超時),而20%的速度放緩正處於關鍵路徑。