2

PostScript书籍总是建议小心处理字典。分离用户字典并保持较小,不再需要时关闭字典,避免重载全局字典等。

但是,我认为,这些说明可以追溯到旧时代,那里的内存存在严重的硬件限制。关闭字典以释放内存。PS 脚本所需的内存可能与机器可用内存相当。在现代,繁重的PostScript任务(例如长文档或复杂的绘图)所需的内存远小于机器内存,关闭包含数百甚至数千个元素的字典应该不会对机器性能产生显着影响。

如我错了请纠正我!考虑一下我们将所有内容都放在一本字典或全局字典中;它对 PostScript 性能有负面影响吗?

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

4

2 回答 2

3

这里的内存和性能问题几乎完全分开。

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

包含垃圾收集使得添加自动扩展字典变得合适,而且他们确实做到了。但是有性能成本:分配更大的字典并重新散列所有键。因此,如果很容易预测字典的最大大小,则可以通过首先创建一个足够大的字典来节省一些时间。您可以通过将字典设置为最大大小的两倍来进一步提高速度,因为这应该可以减少哈希冲突。

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

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

此类信息的一个很好的资源是 Adob​​e 的“绿皮书”,它专门用于组织程序的大小或速度(有时两者兼而有之)的策略。


我只是有一个疯狂的想法。可能有办法两者兼得!假设您将字典完全打包(以使用最少的内存),然后在关键部分添加一个更多元素(强制 dict 扩展),但用saveand括住该部分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

当然,这会丢弃对字典的任何更新,因此,如果您需要这些更新的条目,则必须制作一个副本以展开(保存后,因此恢复会破坏它),并将所需的条目复制回原始条目。当然,这是相当多的额外开销;所以需要这个技巧的代码必须非常关键。:)

于 2012-09-27T00:20:57.170 回答
2

你错了!

首先,一个全局字典并不适用于所有情况。一些 PostScript 语言操作员期望某些字典(包括它们的名称)存在。所以这些你必须保留。

其次,它还有性能和速度的影响,而不仅仅是内存消耗。

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

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

第五,您似乎忘记了在 PostScript(或任何)程序中可以有循环......如果一个泄漏添加到下一个泄漏,任何“内存的一小部分”泄漏都会产生巨大的影响。

第六,您似乎不知道某种类型的错误条件及其返回是语言规范的一部分,这可以通过在相应的“堆栈”上放置错误的项目来触发。

第七,....好吧,在我开始真正的咆哮之前我现在停下来:-)

于 2012-09-26T17:52:34.977 回答