2012-09-26 70 views
2

PostScript書籍總是建議小心處理字典。單獨的用戶字典,並保持它們很小,當不再需要時關閉字典,避免全局字典過載等。爲什麼在PostScript中關閉字典?

但是,我認爲,這些指令回到了存在嚴重硬件限制的舊時代。關閉字典以釋放內存。 PS腳本需要的內存可能與機器可用內存相當。在現代,重要的任務(例如長文檔或複雜繪圖)所需的內存比機器內存小得多,並且關閉具有數百甚至數千元素的字典應該不會對機器性能產生顯着影響。

糾正我,如果我錯了!考慮到我們將所有內容放在一本字典或全球字典中;它對PostScript性能有負面影響嗎?

它是否對分離詞典仍然有利(從性能角度來看,不是簡單的編碼),更重要的是在不需要時關閉它們?或者它只是釋放一小部分內存?

回答

3

這裏的內存和性能問題幾乎是完全獨立的。

Level-1 Postscript描述了只有一種方法來「釋放」內存:通過restore -ing以前的save -d內存狀態。 Level-2(及更高版本)Postscript集成了垃圾回收功能,因此當沒有可訪問的引用時,可以釋放內存。可以禁用垃圾收集以降低性能開銷(這對於速度分析代碼來說是必要的),但是當然,除非您正確使用saverestore,否則內存消耗可能會增加。

包含垃圾回收可以適當地添加自動擴展字典,並且他們做到了。但是性能成本:分配一個更大的字典並重新組合所有密鑰。因此,如果預測字典的最大尺寸很容易,那麼可以通過首先創建足夠大的字典來節省一些時間。您可以通過使字典的最大尺寸增加兩倍來獲得進一步的速度提升,因爲這可以減少散列衝突。

由於在字典上有額外的字典(如果你不需要需要他們),性能會受到不利影響。由於systemdict(所有操作符都在其中)始終是堆棧中的最底層條目,所以對於操作符名稱的所有查找都將在到達systemdict之前搜索(不成功)每個字典。

在內存大小和臺式電腦的處理功率的增加使得這些問題稍差必要(因爲你可以忽略他們,仍然有「工程」計劃),但他們仍然有用 (特別是當你的程序變得更大更復雜時)。

對於這類信息來說,一個非常好的資源是Adobe的「綠皮書」,它致力於組織您的程序的大小或速度(有時是兩者)策略。


我只是有一個瘋狂的想法。有可能有辦法得到假設你完全按照容量打包你的字典(使用最小內存),那麼在關鍵部分添加一個元素(強制字典展開),但用saverestore括起該部分?

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 

當然這種放棄對字典的任何更新,所以如果你需要這些更新的條目,你將不得不作出一個副本擴大(保存後,所以恢復會破壞它),然後複製所需的條目回到原來的。當然這是相當多的額外開銷;所以需要這個技巧的代碼必須是該死的關鍵。 :)

2

你錯了!

首先,一個全球字典不適用於一切。某些PostScript語言運算符期望某些字典(包括它們的名稱)存在。所以這些你必須保持。其次,它還具有性能和速度效果,而不僅僅是內存消耗。

第三,程序員總是保持他的代碼整潔和組織的好主意。第四,你似乎談論的是「機器」,它是(當前)個人計算機模型或更大的。您似乎沒有嵌入式系統及其操作系統(就像很多較小的PostScript打印機一樣)。第五,你似乎忘記了在一個PostScript(或任何)程序中你可以有循環......如果一個泄漏增加到下一個泄漏,任何「微小的內存泄漏」都會產生巨大的影響。

第六,你似乎並不知道某種類型的錯誤條件及其返回是語言規範的一部分,這可以通過在各自的「堆棧」上包含錯誤的條目來觸發。

第七,......好了,我現在停在我開始真正的咆哮:-)