为啥使用 pdfmark /BP、/EP、/SP 的 ghostscript 快得多?

Posted

技术标签:

【中文标题】为啥使用 pdfmark /BP、/EP、/SP 的 ghostscript 快得多?【英文标题】:Why is ghostscript much faster with pdfmark /BP, /EP, /SP?为什么使用 pdfmark /BP、/EP、/SP 的 ghostscript 快得多? 【发布时间】:2017-06-27 04:47:44 【问题描述】:

我们有一些我很难理解的遗留代码 - 原作者已经不在了。

显然,对于某些文件,Ghostscript PS 到 PDF 的转换非常慢,但将对象定义如下所示可以极大地加快速度(我们将 8 小时以上的时间缩短到 8.5 分钟来处理约 20,000 页的文件,而 Adob​​e Distiller 需要约 20 分钟在带有默认选项的原始文件上)。

原始文件提取(使用 PReS 创建):

/@GP

  save exch mark exch
  execform
  cleartomark restore
 bd
...
gsave 0.62 0.62 scale @TestGraphic @GP grestore

@TestGraphic 是 EPS 图像。这似乎并不重要,因为其他程序使用具有类似问题的不同非 EPS 图像。

修改后的文件:

[/_objdef new_graphic /BBox [0 0 595 842] /BP pdfmark
@TestGraphic @GP
[/EP pdfmark
...
gsave 0.62 0.62 scale 
[ new_graphic /SP pdfmark
grestore

我们在 Unix 和 Windows 上看到了各种 gs 版本的类似行为。计时是使用相当标准的选项进行的:

"c:\Program Files (x86)\gs\gs9.21\bin\gswin32c" \
   -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -o test.pdf test.ps

我对诊断速度慢的原因不太感兴趣(从文件中删除敏感数据需要很长时间,但如果确实需要,我可以尝试),而是反对定义和 pdfmark 命令提供的好处。

原始脚本引用了http://wwwimages.adobe.com/content/dam/Adobe/en/devnet/postscript/pdfs/5113.Forms.pdf,旨在在某些打印机 RIP 和 Distiller 上启用 execform 缓存(它们都在处理大型全彩色图像),但是 Ghostscript 不支持 execform 缓存,因此采用了这种替代 pdfmark 技术,没有说明原因。

编辑:添加了删除数据的表单定义要点:

https://gist.github.com/anonymous/676924d451188276053b9b472279e382

【问题讨论】:

【参考方案1】:

您很可能使用的是旧版本的 Ghostscript。您的原始片段使用不常见的 PostScript 表单,并且旧版本的 pdfwrite 设备不会将表单保留为表单,而是在每次使用时“展开”表单定义。

不出所料,这将导致更多更大的输出文件,尤其是如果表单是内容的大部分并且在每个页面上都使用时。

pdfmark 代码定义一个 PDF 对象,然后每次都引用该对象。只有一个对象,因此文件要小得多,因此您在组装它和复制相同数据 20,000 次上花费的时间大大

当然,新版本的 pdfwrite 设备将保留表单,因此很可能直接创建和引用 PDF 对象的好处早已不复存在。

它与表单缓存无关(不是“执行表单缓存”),它与输入 PostScript 中的表单是否保留为输出 PDF 中的表单有关。

顺便说一句,重要的是要理解为什么性能很差,但你不可能理解为什么另一种方法更快。

【讨论】:

感谢 Ken,我测试了包括 9.21 在内的各种版本(如上图所示的命令)。使用 pdfmark 仍然肯定会受益,但这可能是由于构建表单的一种不常见的方式。展开所有重新定义的命令需要一点时间才能看到它真正在做什么。总共有 30 个表单,一些是缩略图大小,另一些是页面的 75%。有些页面只有一个,有些页面有多个。明天我会更深入地挖掘。 我需要看一个例子才能给出完整的答复。当前版本应该能够尊重表单,但老实说,pdfmark 方法几乎肯定会是最有效的,因为它不依赖于设备“发现”表单,它明确命名并使用命名形式。没有启发式,没有检查它是否与现有表单等相同 我添加了一个要点,展示了表单是如何定义的,我知道这是一个远景,但有些东西可能会突然出现在你身上。现在我们将坚持使用 pdfmarks,如果可能的话,我会在下周进行更多研究。如果您想进一步研究,我也可以在 GS bugzilla 上提出一个错误。 我现在实际上正在度假,要到下周一才能回到我的办公桌前。快速浏览一下,表单使用看起来并不完全合法,因为表单必须是原子的,它们不能依赖于解释器状态,也不能改变解释器状态。表单旨在用于表单,而不是用于隔离程序代码块。您应该将 EPS 转换为表单定义,而不是读取随机 EPS。老实说,在我看来,这可能就是问题所在,我们对此无能为力。 看起来,这似乎只是将 EPS 转换为表单的一种(低效)方法。在没有看到后来如何使用该表单的情况下,我看不出为什么这不能像 Ghostscript 那样按预期工作,但是所呈现的骨架被简化太多,无法确定。 30 种不同形式的声音,对我来说不是最理想的,但我真的不知道内容。

以上是关于为啥使用 pdfmark /BP、/EP、/SP 的 ghostscript 快得多?的主要内容,如果未能解决你的问题,请参考以下文章

BP指针和SP指针的区别?

汇编中BP是啥

PDFMarks 初始视图放大到 FitPage

如何在 x86 实模式下正确设置 SS、BP 和 SP?

汇编语言中,SP,BP ,SI,DI作用?

bp,sp,si,di,bx这些可存放地址的寄存器的确切含义和用途