CPUキャッシュ(参照の局所性の恩恵を受けることが知られている)をより有効に活用することに関して、何がより効率的であるかを長い間疑問に思っていました-それぞれが同じ数学的な数値のセットを繰り返し、それぞれが異なる本文ステートメントを持つ2つのループ(たとえば、セットの各要素の関数を呼び出す)、または2つ(またはそれ以上)のbodyステートメントと同等のbodyを持つ1つのループを持つ。すべてのループの後、同じアプリケーション状態を想定しています。
私の意見では、ループで使用される命令とデータがキャッシュに収まるため、ループが2つあると、キャッシュミスとエビクションが少なくなります。私は正しいですか?
仮定:
ループのコストと比較して
f
、呼び出しのコストはごくわずかです。g
f
キャッシュの大部分をそれぞれ単独でg
使用するため、キャッシュが次々に呼び出されたときにキャッシュが流出します(シングルループバージョンの場合)Intel Core Duo CPU
C言語のソースコード
GCCコンパイラ、「余分なスイッチなし」
可能であれば、「時期尚早の最適化は悪」という性格以外の答えが欲しい。
私が提唱している2ループバージョンの例:
int j = 0, k = 0;
for(int i = 0; i < 1000000; i++)
{
j += f(i);
}
for(int i = 0; i < 1000000; i++)
{
k += g(i);
}