ほとんどのアルゴリズム(ソート、検索、グラフトラバーサルなど)の実装では、追加の通常の操作を犠牲にしてメモリアクセスを減らすことでトレードオフが発生することがよくあります。
Knuthには、特定のプロセッサから抽象化し、通常の操作(oops)とメモリ操作(mems)のみを区別することにより、さまざまなアルゴリズム実装の複雑さを比較するための便利な方法があります。
コンパイルされたプログラムでは、通常、コンパイラに低レベルの操作を整理させ、データがキャッシュメモリ(高速)または仮想メモリ(低速)のどちらに保持されるかという問題をオペレーティングシステムが処理することを期待します。さらに、命令の正確な数/コストはコンパイラによってカプセル化されます。
Forthを使用すると、そのようなカプセル化はなくなり、レジスタプロセッサ上で実行されるスタックマシンに近いとはいえ、マシンにはるかに近くなります。
オペレーティングシステムの影響を無視して(メモリのストールなどがないように)、今のところ単純なプロセッサを想定します。
(1)Forthの通常のスタック操作(dup、rot、over、swapなど)をForthのメモリアクセスフェッチ(@)またはストア(!)のコストと比較する方法について誰かがアドバイスできますか?
(2)メモリアクセスの節約とトレードオフする通常の操作の数を決定するために使用できる経験則はありますか?
私が探しているのは、「通常の50オペレーション、通常の500オペレーション、または通常の5オペレーションのメモリアクセスコスト」のようなものです。Ballparkは絶対に問題ありません。
フェッチとストアの相対的なコストと、腐敗、スワップ、重複、ドロップ、オーバー、桁違いの修正の相対的なコストを把握しようとしています。