あなたができることの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ナノ秒で実行されることが示される場合があります。次に、上記のフレームワークを使用して実行すると、プロセッサ全体(レジスタとキャッシュ)がそれ自体にあるという事実を利用できなくなるため、突然、実行時間がマイクロ秒に大幅に増加する可能性があります。