Skip to content

性能基准

本页面呈现 TCPDF-Next 与其他主流 PHP PDF 库(TCPDF、DomPDF、mPDF)的真实性能基准比较。所有数据均来自同一台机器上的 Docker 容器内实测,确保公平、可重现的结果。我们报告中位数而非平均数,以消除离群值干扰。凡 TCPDF-Next 不是最快的场景,我们也如实说明。

测试环境

参数数值
CPUIntel Core i9-13900K (x86-64)
内存64 GB DDR5(Docker 限制 16 GB)
Docker4 CPUs, 16 GB RAM, Ubuntu bookworm
PHP8.5.3(CLI,OPcache 启用,JIT 启用)
TCPDF-Next1.6.0
TCPDF-NextArtisan (Chrome)1.0.0
TCPDF6.10.1
DomPDFv3.1.4
mPDFv8.2.7
预热3 次迭代(丢弃)
测量20 次迭代(取中位数)
计时方式hrtime(true) 纳秒精度挂钟时间

TIP

所有基准测试皆为自动化且可重现。基准测试套件位于仓库的 tests/Benchmark/ 目录中,您可在 Docker 环境内自行执行。

交互式比较图表

▼ Lower is better
TCPDF-Next
0.63 ms
TCPDF
2.5 ms4.0x
DomPDF
4.07 ms6.5x
mPDF
7.13 ms11.3x

PHP 8.5.3 + OPcache + JIT · Docker 4 CPUs / 16 GB · i9-13900K · Median of 20 runs

生成速度

每个场景在预热后运行 20 次。下表展示中位数生成时间、峰值内存、输出文件大小与相对速度。

场景一:简单文档(1 页)

一页 A4 文档,包含标题与基本格式化文字。无图片、无表格。

时间(ms)峰值内存(MB)文件大小(KB)
TCPDF-Next0.6343
TCPDF2.50(3.97x 慢)12(3.0x)7(2.3x)
DomPDF4.07(6.46x 慢)12(3.0x)2(0.7x)
mPDF7.13(11.32x 慢)16(4.0x)28(9.3x)

TCPDF-Next 在简单文档场景中以 0.63 ms 的生成时间遥遥领先——比 TCPDF 快近 4 倍、比 DomPDF 快 6.5 倍、比 mPDF 快 11.3 倍。同时峰值内存仅 4 MB,远低于其他库。

场景二:发票(2 页)

两页发票文档,包含表格行项目、合计、页眉与页脚。

时间(ms)峰值内存(MB)文件大小(KB)
TCPDF1.15169
TCPDF-Next1.641652
DomPDF19.09(11.64x 慢于 Next)164
mPDF21.66(13.21x 慢于 Next)1830

诚实说明

在发票场景中,TCPDF 以 1.15 ms 比 TCPDF-Next 的 1.64 ms 快约 1.4 倍。TCPDF 同时产出更小的文件(9 KB vs 52 KB)。这可能是因为 TCPDF 高度优化的传统表格布局引擎在简单表格内容下更为高效。两个库在此场景中仍远超 DomPDF 和 mPDF。我们如实报告所有数据,不做选择性展示。

场景三:100 页报告

100 页文档,内容为密集混合内容:标题、段落与跨多页的结构化数据。

时间(ms)峰值内存(MB)文件大小(KB)
TCPDF-Next32.391896
TCPDF102.47(3.16x 慢)18101
mPDF1,044.05(32.23x 慢)82(4.6x)181
DomPDF2,705.55(83.53x 慢)70(3.9x)129

100 页场景中 TCPDF-Next 的优势最为显著——以 32.39 ms 完成生成,比 TCPDF 快 3.2 倍,比 mPDF 快 32.2 倍,比 DomPDF 快 83.5 倍。内存使用与 TCPDF 持平,远低于 DomPDF 和 mPDF。这得益于流式输出与高效的内部对象管理。

场景四:HTML 转 PDF(内建解析器)

使用各库内建的 HTML 解析引擎,将包含 CSS 样式、表格、图片与多栏版面的复杂 HTML 文档转换为 PDF。

时间(ms)峰值内存(MB)文件大小(KB)
TCPDF-Next0.93747
TCPDF7.62(8.19x 慢)7413
DomPDF16.09(17.30x 慢)745
mPDF33.62(36.15x 慢)7446

TCPDF-Next 的 HTML 解析引擎在不到 1 ms 内完成转换——比 TCPDF 快 8.2 倍比 mPDF 快 36.2 倍。四个库的峰值内存均为 74 MB,表明该场景的内存消耗主要来自 HTML 解析器基础设施本身。

场景五:HTML 转 PDF(Chrome 渲染 —— TCPDF-NextArtisan)

使用 TCPDF-NextArtisan 调用 Chrome 浏览器进行像素级精确的 HTML 渲染,再导入为 PDF。

时间(ms)峰值内存(MB)文件大小(KB)
TCPDF-NextArtisan (Chrome)309.857437

为什么 Chrome 渲染较慢?

Chrome 渲染模式的 309.85 ms 远高于内建解析器的 0.93 ms,这是由以下技术原因决定的:

  1. Chrome Page 生命周期开销 — 需要与 Chrome 进行多次 CDP(Chrome DevTools Protocol)通信往返,包括页面创建、导航、等待渲染完成等步骤
  2. printToPDF 本身耗时 — Chrome 的 printToPDF 命令本身就需要约 200-300 ms 来完成页面光栅化与 PDF 生成
  3. PDF 解析与 XObject 导入 — 从 Chrome 获取 PDF 后,还需解析该 PDF 并将页面作为 XObject 导入到 TCPDF-Next 文档中,产生额外开销
  4. 已启用 BrowserPool keep-alive — 测试中已使用浏览器连接池保持长连接,避免了每次请求都冷启动浏览器的开销

速度与品质的取舍: DomPDF 和 mPDF 的内建 HTML 引擎虽然更快,但 CSS 支持非常有限。TCPDF-NextArtisan 的 Chrome 渲染模式提供像素完美的 CSS3 支持(包括 Flexbox、Grid、自定义字体、媒体查询等),适用于对排版品质有极高要求的场景。当您需要精确还原设计稿或生成视觉高保真的 PDF 时,这额外的 300 ms 是值得的。

吞吐量

在持续工作负载(60 秒测试)中,每秒与每分钟生成的简单文档(1 页)数量。

单线程模式

文档/秒文档/分钟
TCPDF-Next2,684161,014
TCPDF1,24474,626
DomPDF26015,588
mPDF1337,994

4 Workers 并行模式

文档/秒文档/分钟
TCPDF-Next9,434566,024
TCPDF4,431265,832
DomPDF93956,334
mPDF48429,044

TCPDF-Next 在单线程下可达每分钟约 16.1 万份文档;使用 4 个 Worker 并行时,吞吐量提升至每分钟约 56.6 万份文档——约为 TCPDF 的 2.1 倍、DomPDF 的 10.0 倍、mPDF 的 19.5 倍。对于高容量批处理场景(发票生成、报表生成、对账单生成),这些吞吐量数字直接转化为基础设施成本节省。

数字签名开销

新增数字签名时的额外时间与文件大小。其他三个库均不支持 PAdES 高级签名。

签名等级额外时间额外文件大小备注
PAdES B-B+15 ms+5-8 KB基础签名
PAdES B-T+120 ms*+8-12 KB含时间戳
PAdES B-LT+250 ms*+15-50 KB含长期验证数据
PAdES B-LTA+350 ms*+20-60 KB完整长期归档验证

*包含至 TSA/OCSP 服务器的网络往返时间。实际时间取决于服务器延迟与网络状况。

TIP

PAdES B-B(基础签名)仅增加约 15 ms 和 5-8 KB——对大多数工作流程而言可忽略不计。更高等级(B-T、B-LT、B-LTA)的延迟主要来自时间戳授权机构和 OCSP 响应器的网络调用。

PAdES 支持
TCPDF-NextB-B / B-T / B-LT / B-LTA 全等级支持
TCPDF仅基础 PKCS#7
DomPDF不支持
mPDF不支持

PDF/A-4 归档开销

生成符合 ISO 19005-4 标准的 PDF/A-4 归档文件时的额外开销。

特性额外大小
sRGB ICC 色彩配置文件+3 KB
XMP 元数据+2-5 KB
输出意图+1-3 KB
完整字体嵌入(如需)每字体 +50-500 KB
典型总开销+10-50 KB
生成时间开销< 5%

TIP

PDF/A-4 模式下默认仍使用字体子集化。开销主要来自 ICC 配置文件和扩展的元数据。对于大多数文档,PDF/A-4 开销可忽略不计。

为什么 TCPDF-Next 更快

TCPDF-Next 的性能优势来自以下深思熟虑的架构决策:

  1. 现代 PDF 2.0 核心 — 渲染管线从零构建于 PDF 2.0 之上,消除了拖慢 TCPDF 的传统兼容层。交叉引用流与对象流同时减少了 I/O 和文件大小。

  2. JIT 友好的代码路径 — 热循环与关键渲染方法经过特别设计以充分利用 PHP 8 的 JIT 编译器。紧凑、强类型且分支最小化的代码使 JIT 能够生成高效的机器码。

  3. 延迟资源加载 — 字体、图片与 ICC 配置文件仅在首次使用时加载,而非在构造时。不嵌入图片的文档无需承担任何图片处理开销。

  4. 高效内存布局 — 页面对象经过紧凑处理,通过引用计数复用共享资源(字体、颜色空间),即使在长文档中也能保持低峰值内存。

  5. 优化的 HTML 解析器 — 不同于传统 TCPDF 使用的基于正则的 HTML 解析,TCPDF-Next 采用流式令牌化解析器,在单次遍历中处理 HTML,最小化回溯。

  6. 可并行化设计 — 无状态的页面渲染架构使工作负载可在多个 Worker 间线性扩展,正如 4 Worker 模式下接近 4 倍吞吐量提升所证明的。

测试方法

基准设计原则

  1. 隔离 — 每项基准测试在独立的 PHP 进程中执行,消除交叉测试的内存污染
  2. 预热 — 丢弃前 3 次预热迭代后才开始测量,确保 OPcache 与 JIT 已完全预热
  3. 迭代 — 每项测试场景 20 次测量迭代。报告中位数以消除离群值噪声
  4. 计时hrtime(true) 提供纳秒精度的挂钟时间测量,避免 microtime() 的时钟漂移问题
  5. 内存测量memory_get_peak_usage(true) 报告 PHP 运行时实际分配的峰值内存(RSS)
  6. 文件大小 — 输出写入临时文件后以 filesize() 测量
  7. Docker 隔离 — 使用固定资源配置的 Docker 容器(4 CPUs, 16 GB RAM),所有库在同一 Docker 容器内使用相同的 PHP 配置、CPU 限制与内存限制运行

公平性保证

  • 四个库均使用各自最新的稳定版本
  • 所有库均在相同的 Docker 镜像与 PHP 版本下运行
  • OPcache 与 JIT 对所有库统一启用
  • 测试文档内容完全相同(相同的文字、图片、表格结构)
  • 基准脚本开源,任何人均可审查与重现

重现基准测试

基准测试套件包含在仓库中。要重现这些结果:

bash
cd benchmark
docker compose up --build

结果将在运行结束时打印到标准输出。Docker 配置确保无论宿主操作系统如何,环境都是一致的。

TIP

建议在低负载时段执行基准测试,并关闭其他 CPU 密集型应用程序,以获得最稳定的结果。多次运行并对比结果可进一步验证数据的可靠性。

延伸阅读

以 LGPL-3.0-or-later 许可证发布。