私の理解では、CPU は CPU キャッシュ (L1 など) と連携して数学演算を行い、演算に必要な値がまだキャッシュにない場合、計算を実行する前に RAM からページを取得する必要があります。 . したがって、マネージ ヒープ RAM は、OS がアンマネージ スタック RAM の広大な場所のどこかに見つけた古い穴よりも、Vector データを保持するのに適した場所であると考えるのが合理的です。これは、マネージド メモリがアンマネージド メモリよりも緊密にまとめられていると想定しているためです。そのため、数学演算のベクトル (x、y、z) がキャッシュに読み込まれた同じページに格納される可能性が高くなります。一方、スタック上の構造体としてのベクトルはページが離れている可能性があります。この観点から、構造体ベースのベクトルクラスではなく、クラスベースの長所と短所を説明できる人はいますか?
2 に答える
CPUキャッシュはCPUによって完全に管理されます。最近アクセスされたメモリは、比較的大きなチャンク(つまり、アクセスされた位置の周囲128バイト)によってキャッシュされます。
OSは、物理メモリとの間のページングを管理します。アプリケーションがそのプロセスに頻繁にヒットする場合(つまり、データのサイズが物理RAMよりもはるかに大きい場合)、外部CPUキャッシュラインのヒットとミスについて心配する他の問題があります。
その観点から、スタックとヒープの間に本質的な違いはありません。唯一の意味のある違いは、次に使用されるデータが、最近使用されたデータの1つにどれだけ近いかということです。
ほとんどの場合、数学クラス(ベクトル/行列/ポイント)は、マネージド実装とネイティブ実装の両方のメモリのシーケンシャルブロックに格納されます。したがって、個々の要素をメモリ内で大きく離すために奇妙な割り当てを明示的に行わない限り、キャッシュの動作は同等である可能性があります。
概要:パフォーマンスが非常に重要な場合は、コードのプロファイルを作成し、データをコンパクトに保つようにしてください。
アレイ全体で異なる反復順序を試して測定してください。つまり、反復が遅くなる可能性があるたびにキャッシュラインを横切る場合、2D配列で最初に行ごとまたは列ごとに歩くと、ほとんどの配列アクセスでキャッシュを再設定する必要がある場合に、十分な大きさのデータセットに対して測定可能な違いが示される可能性があります...
スタックはより高速です ここは、それをより詳細にカバーするサイトです。