2

PostScript本は常に辞書を慎重に扱うことを提案しています。ユーザー辞書を分離して小さくしておく、不要になったら辞書を閉じる、グローバル辞書のオーバーロードを避ける、など。

ただし、これらの命令は、ハードウェアのメモリに厳しい制限があった古い時代にさかのぼると思います。ディクショナリを閉じてメモリを解放します。PS スクリプトが必要とするメモリは、おそらくマシンで使用可能なメモリと同等でした。現代では、重いPostScriptタスク (長いドキュメントや複雑な描画など) に必要なメモリは、マシンのメモリよりもはるかに少なく、数百または数千の要素を含む辞書を閉じても、マシンのパフォーマンスに大きな影響はありません。

間違っていたら訂正してください!すべてを 1 つのディクショナリまたはグローバル ディクショナリに入れることを検討してください。PostScript のパフォーマンスに悪影響がありますか?

辞書を分離し、さらに重要なことに、不要なときにそれらを閉じることは(コーディングの容易さではなく、パフォーマンスの観点から)依然として有益ですか?それとも、メモリのほんの一部を解放するだけですか?

4

2 に答える 2

3

ここでのメモリとパフォーマンスの問題は、ほぼ完全に別物です。

レベル 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への更新をすべて破棄するため、これらの更新されたエントリが必要な場合は、コピーを作成して展開し(保存後、復元すると破棄されます)、目的のエントリを元にコピーする必要があります。そしてもちろん、これはかなりの余分なオーバーヘッドです。したがって、このトリックを必要とするコードは、とてつもなくクリティカルでなければなりません。:)

于 2012-09-27T00:20:57.170 に答える
2

あなたは間違っている!

まず、1 つのグローバル ディクショナリがすべての場合に機能するわけではありません。一部の PostScript 言語演算子は、特定の辞書 (名前を含む) が存在することを想定しています。したがって、これらは保持する必要があります。

次に、メモリ消費だけでなく、パフォーマンスと速度にも影響します。

第三に、プログラマーが自分のコードをきちんと整理しておくことは常に良い考えです。

第 4 に、あなたは (現在の) パーソナル コンピュータ モデル以上の「マシン」について話しているようです。組み込みシステムとその OS を念頭に置いていないようです (多くの小さな PostScript プリンターが使用するように)。

第 5 に、PostScript (または任意の) プログラムではループを使用できることを忘れているようです...「メモリのごく一部」のリークは、1 つのリークが次のリークに追加されると大きな影響を与える可能性があります。

第 6 に、言語仕様の一部である特定のタイプのエラー状態とその戻り値を認識していないようです。これは、それぞれの「スタック」に間違ったアイテムがあることによって引き起こされる可能性があります。

7番目、....OK、本当の暴言を始める前にここでやめます:-)

于 2012-09-26T17:52:34.977 に答える