Memory 为什么要在PostScript中关闭词典?

Memory 为什么要在PostScript中关闭词典?,memory,stack-overflow,postscript,Memory,Stack Overflow,Postscript,PostScript书籍总是建议仔细处理字典。将用户词典分开并保持较小,在不再需要时关闭词典,避免使全局词典过载,等等 然而,我认为,这些指令可以追溯到旧时代,那里存在严重的内存硬件限制。关闭字典以释放内存。PS脚本所需的内存可能与机器可用内存相当。在现代,繁重的PostScript任务(如长文档或复杂绘图)所需的内存远小于机器内存,关闭包含数百甚至数千个元素的词典对机器性能没有显著影响 如果我错了,请纠正我!我们把所有的东西放在一本字典或全球字典里;这对PostScript的性能有负面影响吗

PostScript
书籍总是建议仔细处理字典。将用户词典分开并保持较小,在不再需要时关闭词典,避免使全局词典过载,等等

然而,我认为,这些指令可以追溯到旧时代,那里存在严重的内存硬件限制。关闭字典以释放内存。PS脚本所需的内存可能与机器可用内存相当。在现代,繁重的
PostScript
任务(如长文档或复杂绘图)所需的内存远小于机器内存,关闭包含数百甚至数千个元素的词典对机器性能没有显著影响

如果我错了,请纠正我!我们把所有的东西放在一本字典或全球字典里;这对PostScript的性能有负面影响吗

将字典分开,更重要的是在不需要时关闭它们,这是否仍然有益(从性能的角度来看,而不是从编码的容易程度来看)?还是只释放了一小部分内存?

你错了

首先,一本全球词典并不是万能的。一些PostScript语言运算符希望存在某些词典(包括它们的名称)。所以这些你必须保留

其次,它还具有性能和速度效应,而不仅仅是内存消耗

第三,对于程序员来说,保持代码整洁和有条理总是一个好主意

第四,你似乎在谈论(当前)个人电脑型号或更大的“机器”。您似乎没有考虑嵌入式系统及其操作系统(就像许多较小的PostScript打印机一样)

第五,您似乎忘记了在PostScript(或任何)程序中可以有循环。。。而且,如果一次泄漏加上下一次泄漏,任何“极小部分内存”泄漏都可能产生巨大影响

第六,您似乎不知道某种类型的错误条件及其返回是语言规范的一部分,这可能是由于在相应的“堆栈”上有错误的项而触发的


第七。。。。好的,在我开始真正的咆哮之前,我现在停止:-)

这里的内存和性能问题几乎是完全独立的

第1级Postscript只描述了一种“释放”内存的方法:通过
还原
-ing先前的
保存
-d内存状态。级别2(及更高级别)的Postscript包含垃圾收集,因此当没有可访问的引用时,可以释放内存。可以禁用垃圾收集以减少性能开销(这对于分析代码以提高速度是必要的),但当然,除非您正确使用
save
restore
,否则内存消耗可能会增加

垃圾收集的加入使得添加自动扩展的字典变得非常合适,事实确实如此。但这需要付出性能代价:分配一个更大的字典并重新设置所有键的大小。因此,如果很容易预测字典的最大大小,那么首先创建一个足够大的字典可以节省一些时间。通过使字典的大小增加两倍,您可以进一步提高速度,因为这样可以减少哈希冲突

在dictstack上有额外的字典(如果不需要的话)会对性能产生不利影响。由于systemdict(所有运算符所在的位置)始终是堆栈上的底部条目,因此所有运算符名称的查找都将在到达systemdict之前搜索(未成功)所有挡道的词典

桌面计算机内存大小和处理能力的增加使这些问题变得不那么必要(因为你可以忽略它们,仍然有一个“工作”的程序),但它们仍然有用(特别是当你的程序变得更大、更复杂时)

这类信息的一个很好的来源是Adobe的“绿皮书”,该书专门介绍了按大小或速度(有时两者)组织程序的策略


我有个疯狂的想法。也许有一种方法可以两者兼得!假设您将字典完全打包到容量(以使用最小内存),然后在关键部分添加一个元素(强制扩展dict),但将该部分括在
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的任何更新,因此如果需要这些更新的条目,则必须创建一个副本以展开(保存后,还原将销毁它),然后将所需条目复制回原始条目。当然,这是相当多的额外开销;因此,需要这种技巧的代码必须非常关键。:)