这里的内存和性能问题几乎完全分开。
Level-1 Postscript 仅描述了一种“释放”内存的方法:通过restore
-ing 先前的save
-d 内存状态。2 级(及以上)Postscript 包含垃圾收集,因此当没有可访问的引用时可以释放内存。可以禁用垃圾收集以降低性能开销(这对于分析代码以提高速度是必要的),但当然,除非您正确使用save
,否则您的内存消耗可能会增加restore
。
包含垃圾收集使得添加自动扩展字典变得合适,而且他们确实做到了。但是有性能成本:分配更大的字典并重新散列所有键。因此,如果很容易预测字典的最大大小,则可以通过首先创建一个足够大的字典来节省一些时间。您可以通过将字典设置为最大大小的两倍来进一步提高速度,因为这应该可以减少哈希冲突。
并且在 dictstack 上有额外的字典(如果你不需要它们)会对性能产生不利影响。由于 systemdict(所有运算符所在的位置)始终是堆栈中的底部条目,因此对运算符名称的所有查找都将搜索(不成功)在到达 systemdict 之前遇到的每个字典。
台式计算机的内存大小和处理能力的增加使得这些问题不再那么必要(因为您可以忽略它们并且仍然有一个“工作”的程序),但它们仍然有用(特别是当您的程序变得更大并且更复杂)。
此类信息的一个很好的资源是 Adobe 的“绿皮书”,它专门用于组织程序的大小或速度(有时两者兼而有之)的策略。
我只是有一个疯狂的想法。可能有办法两者兼得!假设您将字典完全打包(以使用最少的内存),然后在关键部分添加一个更多元素(强制 dict 扩展),但用save
and括住该部分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
当然,这会丢弃对字典的任何更新,因此,如果您需要这些更新的条目,则必须制作一个副本以展开(保存后,因此恢复会破坏它),并将所需的条目复制回原始条目。当然,这是相当多的额外开销;所以需要这个技巧的代码必须非常关键。:)