C ++で単純なポインター演算を使用して、非常に大きなファイルから読み取るためにmmap呼び出しを使用しています。問題は、データの小さなチャンク (KB のオーダー) を複数回読み取ると、各読み取りに前の読み取りと同じ時間がかかることです。要求を満たすためにディスクがアクセスされているかどうか、または最初の呼び出しの後の呼び出しで要求がメイン メモリ (ページ キャッシュ) から処理されているかどうかを確認するにはどうすればよいですか。
2 に答える
問題は次のとおりです。両方の読み取りがキャッシュから実行されていました。データを要求する前に、ファイルが開かれるか、mmap されると、キャッシュが開始されると思います。これを確認するために、次を発行しました。
echo 3 > /proc/sys/vm/drop_caches
これによりキャッシュがフラッシュされ、同じデータを取得するために 2 回反復を実行すると、最初の実行は (私の場合) 2 回目の実行よりも 10 倍遅くなります。
参照の局所性を利用すると、最高のキャッシュ パフォーマンスが得られます。. つまり、メモリ内で接近している変数にアクセスし (たとえば、変数を昇順で 1 つずつステップ実行する)、これらのアクセスを時間内に実行する場合 (つまり、これらの要素の読み取りの間に他の多くのメモリ アクセスを実行しない場合)、最高のキャッシュ パフォーマンスが得られます。各読み取りにかかる時間がほぼ同じである場合は、キャッシュされている可能性が非常に高くなります。物事がキャッシュから提供されていない場合、それは通常、数回の高速読み取り (キャッシュ ヒット) に続いてスパイク (キャッシュ ミス) が続き、さらに高速な読み取りが続くことで示されます。ほとんどすべてのシステムで、キャッシュ ミスが発生すると、データが存在するチャンクがキャッシュに読み込まれるため、近くの変数 (同じチャンク内にある) にアクセスすると、それらはキャッシュ内にあります。