相同代码下,TCPDF 的速度是 FPDF 的两倍

Posted

技术标签:

【中文标题】相同代码下,TCPDF 的速度是 FPDF 的两倍【英文标题】:TCPDF twice as slow as FPDF with same code 【发布时间】:2011-01-18 02:58:29 【问题描述】:

我目前使用 FPDF 创建一些相当复杂的报告,并正在尝试升级到 TCPDF,但我发现通过 TCPDF 运行的相同代码的速度大约慢了一倍。因为我的 PDF 文件已经需要一分钟的时间来生成,所以我无法承受这样的速度,但我真的很想利用一些 TCPDF 功能(比如创建书签)。

如果有人能提供有关此问题的一些信息,我将不胜感激 - 无论是您为加快 TCPDF 速度所做的事情,还是只是确认它的运行速度比 FPDF 慢,所以我可以忘记它并坚持使用 FPDF。

【问题讨论】:

【参考方案1】:

这是一个甜蜜的解决方案,对我来说剃须 2 分钟。 PDF 在 3 秒内创建!

http://www.bitrealm.net/2010/08/tcpdf-is-slow-here-is-the-solution/

替换

$font = $this->_getTrueTypeFontSubset($font, $subsetchars);

用这个:

/ Alcal: $font2cache modification
// This modification creates utf-8 fonts only the first time,
// after that it uses cache file which dramatically reduces execution time
if (!file_exists($fontfile.'.cached'))
// calculate $font first time
$subsetchars = array_fill(0, 512, true); // fill subset for all chars 0-512
$font = $this->_getTrueTypeFontSubset($font, $subsetchars); // this part is actually slow!
// and then save $font to file for further use
$fp=fopen($fontfile.'.cached','w');
$flat_array = serialize($font); //
fwrite($fp,$flat_array);
fclose($fp);

else 
// cache file exist, load file
$fp=fopen($fontfile.'.cached','r');
$flat_array = fread($fp,filesize($fontfile.'.cached'));
fclose($fp);
$font = unserialize($flat_array);

【讨论】:

【参考方案2】:

http://www.tcpdf.org/performances.php

默认情况下,TCPDF 启用字体子集以减小嵌入的 Unicode TTF 字体的大小,这个过程非常缓慢且需要大量内存,可以使用 setFontSubsetting(false) 方法关闭;

这对我来说是真正的解决方案。

【讨论】:

【参考方案3】:

自 5.9.067 版以来,TCPDF 的性能得到了显着提升。 每个新版本似乎都表现得更好。 此外,您可以将其设置为提高性能,如 http://www.tcpdf.org/performances.php

中所述

【讨论】:

【参考方案4】:

可以通过禁用配置文件中未使用的功能并关闭字体子集等慢速功能来调整 TCPDF 性能。 在非 UTF8 模式下仅使用核心字体(如 Helvetica、Times 等)可以获得良好的性能。 此外,您可以在服务器上安装 XCache 以提高 PHP 性能。 查看官方http://www.tcpdf.org 网站和论坛了解更多信息。

【讨论】:

以上是关于相同代码下,TCPDF 的速度是 FPDF 的两倍的主要内容,如果未能解决你的问题,请参考以下文章

FPDF.php 的文件大小比 TCPDF.php 小约 20 倍?为啥?

为啥 std::vector 的速度是原始数组的两倍?包含完整代码

三元运算符的速度是 if-else 块的两倍?

.NET 4.6 RC x64 的速度是 x86 的两倍(发行版)

Julia 的广播速度是 Matlab 的两倍

PHP导出成PDF你用哪个插件