這裏的內存和性能問題幾乎是完全獨立的。
Level-1 Postscript描述了只有一種方法來「釋放」內存:通過restore
-ing以前的save
-d內存狀態。 Level-2(及更高版本)Postscript集成了垃圾回收功能,因此當沒有可訪問的引用時,可以釋放內存。可以禁用垃圾收集以降低性能開銷(這對於速度分析代碼來說是必要的),但是當然,除非您正確使用save
和restore
,否則內存消耗可能會增加。
包含垃圾回收可以適當地添加自動擴展字典,並且他們做到了。但是性能成本:分配一個更大的字典並重新組合所有密鑰。因此,如果預測字典的最大尺寸很容易,那麼可以通過首先創建足夠大的字典來節省一些時間。您可以通過使字典的最大尺寸增加兩倍來獲得進一步的速度提升,因爲這可以減少散列衝突。
由於在字典上有額外的字典(如果你不需要需要他們),性能會受到不利影響。由於systemdict(所有操作符都在其中)始終是堆棧中的最底層條目,所以對於操作符名稱的所有查找都將在到達systemdict之前搜索(不成功)每個字典。
在內存大小和臺式電腦的處理功率的增加使得這些問題稍差必要(因爲你可以忽略他們,仍然有「工程」計劃),但他們仍然有用 (特別是當你的程序變得更大更復雜時)。
對於這類信息來說,一個非常好的資源是Adobe的「綠皮書」,它致力於組織您的程序的大小或速度(有時是兩者)策略。
我只是有一個瘋狂的想法。有可能有辦法得到!假設你完全按照容量打包你的字典(使用最小內存),那麼在關鍵部分添加一個元素(強制字典展開),但用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
當然這種放棄對字典的任何更新,所以如果你需要這些更新的條目,你將不得不作出一個副本擴大(保存後,所以恢復會破壞它),然後複製所需的條目回到原來的。當然這是相當多的額外開銷;所以需要這個技巧的代碼必須是該死的關鍵。 :)