4

著者が「高度に最適化されている」と主張するコードのチャンクで作業を始めたところです。ある時点で、彼らはこれを行います:

namespace somename 
{ 
  static float array[N]; 
} 

float Someclass::some_function(std::vector<float>& input) 
{
  // use somename::array in some way 
  return result; 
}

somename::array永続性コード(私たちがほとんど制御できない)の問題のため、作成者はクラスに含まれていません。some_functionこのクラスは、が呼び出されたときに配列に対してO(N ^ 2)操作を実行します。したがってarray、関数呼び出し内に移動すると、

float Someclass::some_function(std::vector<float>& input) 
{
  float array[N];
  // use somename::array in some way 
  return result; 
}

パフォーマンスの低下を予想するのは合理的ですか?言い換えれば、多くの異なるシステムやコンパイラーで、作成者の最適化(関数内の配列ではなくグローバル配列を使用)がパフォーマンスに役立つことは明らかですか?

4

3 に答える 3

2

数字が重要なので:

./trial2.out 59.08sユーザー0.01sシステム88%cpu 1:07.01合計

./trial.out 59.40sユーザー0.00sシステム99%cpu59.556合計

ソースコード: http: //pastebin.com/YA2WpTSU(代替コードのコメントとテスト済み)

だから、違いはありません。コンパイル済み:

gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)

関数内で非静的配列を使用しているときの時間の結果:

./trial.out  57.32s user 0.04s system 97% cpu 58.810 total

./trial.out  57.77s user 0.04s system 97% cpu 59.259 total

繰り返しになりますが、違いはありません。配列を使用する場合、配列はヒープではなく関数スタックの一部であるため、関数が呼び出されるたびにメモリを予約することによるオーバーヘッドはありません。動的割り当てを使用した場合は、まったく異なるシナリオになります(この場合、パフォーマンスに大きな違いがあったと思います)。

于 2012-05-05T18:58:54.417 に答える
1

違いに気付かないかもしれませんが、違いはあります。キーワードを使用staticすると、配列はプログラムのDATAセグメントに存在し、ランタイム全体のままになります。キーワードがないstaticと、配列はスタックに存在し、関数を呼び出すたびに初期化されます。それでも、局所性が高く、キャッシュミスが少ないため、スタックバージョンの方が適しています。あなたの場合、どちらのバージョンが優れているかを測定する必要があります。私の場合(69個の64ビット数の1つの配列と48 * 12文字の2番目の2次元配列)、静的バージョンは大幅に高速でした。

于 2012-05-06T19:27:00.977 に答える
0

唯一の違いは、「配列」はグローバルに割り当てられ(静的に宣言されている場合)、関数本体で宣言されている場合はスタックに「割り当て」られることです。ここで本当に重要なのは、配列のサイズ(N)です。大きな配列の場合は、スタックで宣言できない可能性があるため、静的なままにしておくことができます。3番目のオプションは、動的に割り当てることです(ヒープ、新しいキーワードを使用)。ただし、これらすべての仮定は、関数自体のパフォーマンスに実際に影響を与えることはありません。一度割り当てられると、これらのメソッドのいずれにもオーバーヘッドはありません。

于 2012-05-05T18:53:43.600 に答える