プログラム全体で 20 個の整数を使用する C または C++ プログラムがある場合、サイズ 20 の配列を作成して整数を格納し、各数値のエイリアスを作成するとパフォーマンスが向上しますか?
int は int 配列の一部として一緒にキャッシュに読み込まれるため (または、少なくとも、この可能性が向上します)、キャッシュの局所性が向上しますか?
プログラム全体で 20 個の整数を使用する C または C++ プログラムがある場合、サイズ 20 の配列を作成して整数を格納し、各数値のエイリアスを作成するとパフォーマンスが向上しますか?
int は int 配列の一部として一緒にキャッシュに読み込まれるため (または、少なくとも、この可能性が向上します)、キャッシュの局所性が向上しますか?
問題は、それらにどのようにスペースを割り当てるかです。new int
コードのあちこちでランダムに 20 回実行しているとは思えません。それらがローカル変数である場合、それらはスタックに置かれ、キャッシュされます。
主な質問は、気にする価値があるかどうかです。最初にプログラムを読みやすく洗練された方法で書くようにしてください。次に、マイクロ最適化をいじり始めた後にのみ、主要なボトルネックを取り除くようにしてください。20個のintを処理している場合、それらは本質的に配列である必要はありませんか?
また、それは理論的な問題ですか?そうであれば、配列はメモリ内の 20 個のランダム領域よりもキャッシュされる可能性があります。それが実際的な問題である場合、超臨界パフォーマンス コードを作成していない限り、これが本当に重要であるとは思えません。
はい、パフォーマンスが少し向上する可能性があります。また、パフォーマンスが完全に損なわれる可能性もあります。または、コンパイラがすでに同様のことを行っているため、まったく影響がない可能性があります。または、違いを生むのに十分な頻度でこれらの整数を使用していないため、影響がない可能性があります。
また、1 つまたは複数のスレッドがこれらの整数にアクセスするかどうか、および数値を読み取るだけか変更するかによっても異なります。(複数のスレッドがあり、それらの整数に書き込む場合、それらを配列に入れると、偽の共有が発生し、期待していた以上にパフォーマンスが低下します)
それでは、試してみませんか?
単純な、単一の答えはありません。あなたが得ようとしている唯一の深刻な答えは、「場合による」です。自分のケースでどのように動作するかを知りたい場合は、2 つのオプションがあります。
#2 を選択した場合は、推測が正しいことを確認するために、とにかく #1 でフォローアップする必要があります。
パフォーマンスは単純ではありません。普遍的なルールはほとんどなく、すべてはコンテキストに依存します。ある場合には最適化である変更は、別の場合にはすべてを遅くする可能性があります。
コードの最適化を真剣に考えている場合、上記の 2 つの手順に代わるものはありません。そして、あなたがそれについて真剣でないなら、それをしないでください. :)
それで、あなたは現在、約20個の整数を作るためにint positionX, positionY, positionZ;
どこか他の場所int fuzzy;
やなどを持っていますか?int foo;
そして、あなたはこのようなことをしたい:
int arr[20];
#define positionX arr[0]
#define positionY arr[1]
#define positionZ arr[2]
#define fuzzy arr[3]
#define foo arr[4]
パフォーマンスの違いがある場合、コンパイラはarr
他の場所で使用していることに気づき、レジスタを使用して の値を格納できないため、速度が遅くなる可能性があると予想されfoo
ます。update_position
に触れるarr[0]..arr[2]
。それは、「同じデータに触れている」というコンパイラーの検出がどれほど細かいかによって異なります。そして、特に配列の場合、オブジェクトの個々のフィールドではなく、「オブジェクト」に基づいていることが多いのではないかと思います。
ただし、位置変数など、近くで使用されるデータがある場合は、それらを隣り合わせにするとおそらく役立つでしょう。
しかし、変数を隣り合わせに配置しようとして時間を無駄にしていると真剣に考えており、配列を使用することはほぼ間違いなく悪い考えです。
はい、20 個の整数が同じキャッシュ ラインで終了する理論上の可能性は高くなりますが、配列を使用しない場合でも、優れたコンパイラはほぼ常に同じパフォーマンスを再現できると思います。
パフォーマンスが低下する可能性があります。最新のコンパイラは、ユーザーが見ていないときに変数をメモリ内で移動し、2 つの変数が同時に使用されていないときに同じアドレスに格納することがあります。配列のアイデアでは、これらの変数は重複できず、個別のキャッシュ ラインを使用する必要があります。
はい、これによりパフォーマンスが向上する可能性がありますが、実際には変数が一緒に使用され、一緒に保存する必要があるため、そうではない場合があります。
したがって、それらが一緒に使用されている場合は、はい。変数とオブジェクトは、スタック (ほとんどの場合、レベル 1 キャッシュ) に格納されるため、それらが使用される関数で実際に宣言する必要があります。
そうです、それらを一緒に使用する場合、つまりそれらが互いに関連している場合、これはおそらくもう少し効率的であり、それらにメモリを割り当てる方法も考慮する必要があります。