首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在PostScript中关闭字典?

为什么在PostScript中关闭字典?
EN

Stack Overflow用户
提问于 2012-09-26 23:18:28
回答 2查看 168关注 0票数 2

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

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-27 08:20:57

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

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

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

另外,在指定堆栈上使用额外的字典会对性能产生不利影响(如果不需要它们的话)。由于systemdict (所有运算符所在的位置)始终是堆栈的最底层条目,因此在到达systemdict之前,所有对操作符名称的查找都将搜索(不成功)每个阻碍的字典。

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

这类信息的一个非常好的资源是Adobe的“绿皮书”,它致力于根据大小或速度(有时两者兼而有之)来组织程序的策略。

我刚刚有了个疯狂的想法。也许有一种方法可以同时做到这两点!假设您将字典打包到一定的容量(以使用最少的内存),然后在关键部分中再添加一个元素(强制扩展字典),但使用saverestore将该部分括起来

代码语言:javascript
复制
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

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

票数 3
EN

Stack Overflow用户

发布于 2012-09-27 01:52:35

你错了!

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

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

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

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

第五,你似乎忘记了在PostScript (或任何)程序中你可以有循环……如果一个漏洞加上下一个漏洞,那么任何“极小的内存”泄漏都会产生巨大的影响。

第六,你似乎没有意识到某种类型的错误条件及其返回,这些错误条件和返回是语言规范的一部分,它们可以通过在各自的“栈”上有错误的项来触发。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12605029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档