2016-05-06 5 views
0

何百万回も呼び出す必要がある関数があるとしましょう。この関数で実行される算術演算はそれほど重くはないので、すべての変数がどのくらい高速に割り当てられるかが重要です。また、変数は常にスタックに割り当てられると仮定します。 最も単純なケースの例:大きなローカル変数で頻繁に呼び出される関数を最適化する(C++)

void doSomething(){ 
    int aReallyLargeVariable[10000]; 
    ...performing a few light operations on that variable and returning nothing... 
} 

私は関数が戻るときに、すべてのそれの変数が破壊されていることを知っているので、
は、静的またはグローバル作ることによって、この変数をキャッシュする方が良いのではないでしょうか?それを最適化する最良の方法は何でしょうか?

+1

変数を関数のパラメータにし、多くの関数呼び出しで同じ変数を使用しますか? – rozina

+0

関数は再帰的に呼び出されるか、同時に呼び出されますか? –

+1

- あなたは既に別の設計を知っているので、ベンチマークの結果をあなたがすでに実行していなければならない比較で共有できますか? –

答えて

3

パフォーマンスの問題を引き起こすのは割り当てではありません。問題は

int aReallyLargeVariable[10000]; 

int aReallyLargeVariable[10000] = {0}; 

がどうなる多くの時間がかかることはありませんときに、それを初期化することです。また、巨大なオブジェクトを動的に作成すると問題が発生することがあります。

ロジックがあまり重くなく、プリミティブ型のみを使用する関数を持つ場合は、それをinlineと定義し、パフォーマンスについて心配する必要はありません。

あなたはそれが何回も呼ばれて考えると、この機能を最適化するには1000個の以上の要素

1

を持っている必要はありませんstackまたはvectorのような別のデータ構造を考えるオブジェクトの大きな量を定義する必要がある場合は、最初のステップはdo not declare the large variable locallyでなければなりません。これを行うと、いくつかのことが起こります。

  • ローカルに配列を宣言し、たぶんわずかな値しか使用していないので、多くのスタックスペースが無駄になります。
  • この宣言によって引き起こされるスタック操作(プッシュ/ポップ)は、おそらく関数が必要とする実際の作業よりも重要です。

この配列を別の場所に宣言することをお勧めします(必要があればこれをグローバルに宣言することをお勧めします)。配列へのポインタを渡してください。この方法では、メモリを再利用して、時間を無駄にすることもありません。

+0

m.antkowiczによると、スタック操作そのもの(push/pop)に必要な時間は、ローカル変数のサイズの影響を受けません。これらの操作はレジスタ値を変更するだけです。 –

関連する問題