ここでのメモリとパフォーマンスの問題は、ほぼ完全に別物です。
レベル 1 の Postscript では、メモリを「解放」する方法が 1 つだけ説明されrestore
ていsave
ます。レベル 2 (およびそれ以降) の Postscript にはガベージ コレクションが組み込まれているため、アクセス可能な参照がない場合にメモリを解放できます。パフォーマンスのオーバーヘッドを減らすためにガベージ コレクションを無効にすることができます (これは、コードをプロファイリングして速度を上げるために必要ですsave
) restore
。
ガベージ コレクションを含めることで、自動拡張辞書を追加することが適切になります。ただし、パフォーマンス コストがかかります。より大きな辞書を割り当て、すべてのキーを再ハッシュする必要があります。したがって、ディクショナリの最大サイズを簡単に予測できる場合は、最初に十分な大きさのディクショナリを作成することで、この時間を節約できます。辞書を最大サイズの 2 倍にすることで、ハッシュの衝突が減るため、さらに高速化できる場合があります。
また、dictstack に余分な辞書があると、パフォーマンスが悪影響を受けます (不要な場合)。systemdict (すべての演算子がある場所) は常にスタックの一番下のエントリであるため、演算子名のすべてのルックアップは、systemdict に到達する前に邪魔になる各辞書を検索します (失敗します)。
デスクトップ コンピューターのメモリ サイズと処理能力の増加により、これらの懸念事項の必要性はいくぶん少なくなりますが (無視しても「動作する」プログラムを使用できるため)、依然として有用です(特にプログラムが大きくなり、より複雑)。
この種の情報を得るには、アドビの「グリーン ブック」が非常に役立ちます。これは、サイズまたは速度 (場合によっては両方) でプログラムを編成するための戦略に専念しています。
私はちょうどクレイジーな考えを持っていました。両方手に入れる方法もあるかもしれません!ディクショナリを正確に容量に詰め込み (最小限のメモリを使用するため)、クリティカル セクションにもう 1 つの要素を追加し (ディクテーションを強制的に展開させます)、セクションをsave
およびrestore
?で囲んでいるとします。
4 dict begin
/x 5 def
/y 7 def
/z 9 def
/t 12 def
currentdict end
%critical section
begin /save save def
%Do something critical
save end restore
もちろん、これはdictへの更新をすべて破棄するため、これらの更新されたエントリが必要な場合は、コピーを作成して展開し(保存後、復元すると破棄されます)、目的のエントリを元にコピーする必要があります。そしてもちろん、これはかなりの余分なオーバーヘッドです。したがって、このトリックを必要とするコードは、とてつもなくクリティカルでなければなりません。:)