2

CPU キャッシュは、いくつかのコードのパフォーマンスをテストするものを常に中断します。

gettime();
func1();
gettime();

gettime();
func2();
gettime();
// func2 is faster because of the cache.(or page faults of func1())
// But we often misunderstand.

コードのパフォーマンスを測定するとき、キャッシュの影響をどのように取り除きますか。

Windowsでこれを行うための機能または方法をいくつか見つけています。
素敵なヒントを教えてください。ありがとう。

4

2 に答える 2

1

あなたができることの1つは、プロファイリングしているアイテムへの呼び出しの間に、多くのコードを持ち、多くのメモリにアクセスする関数を呼び出すことです。たとえば、擬似コード(ほとんどの場合言語に依存しない)では、次のようになります。

// loop some number of times
{
  //start timing
  profile_func();
  //stop timing
  //add to total time
  large_func(); // Uses lots of memory and has lots of code
}
// Compute time of profile func by dividing number of iterations by total time

large_func()のコードは、操作のセットが何度も繰り返されるように、意味のないコードにすることができます。重要なのは、コンパイル時にコードまたはそのコードが最適化されないため、CPUのコードキャッシュとデータキャッシュ(および、L2とL3(存在する場合)のキャッシュも)が実際にクリアされることです。

これは多くの場合、非常に重要なテストです。重要な理由は、単独でプロファイリングされることが多い小さな高速関数は、CPUキャッシュ、インライン化、および登録を利用して、非常に高速に実行できるためです。ただし、多くの場合、大規模なアプリケーションでは、これらの高速関数が呼び出されるコンテキストのために、これらの利点はありません。

例として、タイトなループで100万回の反復を実行して関数をプロファイリングするだけで、関数がたとえば50ナノ秒で実行されることが示される場合があります。次に、上記のフレームワークを使用して実行すると、プロセッサ全体(レジスタとキャッシュ)がそれ自体にあるという事実を利用できなくなるため、突然、実行時間がマイクロ秒に大幅に増加する可能性があります。

于 2010-10-30T14:38:02.097 に答える
0

優れたコードはキャッシュを利用するため、キャッシュをオフにすることはできません(オフにすることはできますが、これらの結果はまったく関係ありません)。

必要なのは、連続するテストの間にキャッシュを空にする(または無効にする)ことです。ここにいくつかのヒントがあります:CPUのキャッシュを無効にする

于 2010-10-30T14:37:38.233 に答える