2017-07-10 14 views
0

この質問は値や参照によって大きなオブジェクトを渡すことではなく、他の多くの質問と同様に移動セマンティクスではありません。C++ 11はconst参照よりも悪いPOD型の値渡し

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参照が高速になり、少し期待しました。しかし、const参照の受け渡しは、Number = doubleを使用するとさらに速くなりました。これは私を完全に驚かせるものでした(私のコンピュータでは、値渡しでは3.5、const参照では2.9でした)。

これはなぜですか?このような単純な例では、メモリアクセスを含む作業量は同じではありませんか?私はテンプレートライブラリを書く必要があり、テンプレート引数のサイズに応じてconst参照や値渡しを慎重に使いたいと思っていましたが、今は心配するのは無駄です。他の誰もが何が起こっているか考えている?

私が最適化でコンパイルすると、両方の品種が同等に高速に実行されます。

+15

"* gccで最適化せずにコンパイルしました。*"これは問題です。最適化されていないコードの相対的なパフォーマンスを心配するにはあまり時間を費やす価値はありません。 – juanchopanza

+1

"最適化でコンパイルすると、両方の品種が同じ速度で実行されます。" あなたは何をしたいですか? – DaOnlyOwner

+2

私はこの質問を閉じるに投票します。なぜなら、識別可能な問題については尋ねないからです。 –

答えて

3

最適化されていないおもちゃのコードが同じような場合に20%遅くなる場合は、コンパイラの作成者は気にしません。それが理由です。

極端なコーナーでは、デバッグビルドがソフトリアルタイムの要件を満たすのに十分速い必要がある場合を除いて、どちらもそうしてはいけません(たとえば、XHzごとにレンダリングを完了したり、ネットワーク接続がタイムアウトする)、20%の減速がクリティカルな経路にあることを示します。

関連する問題