效能基準
本頁面呈現 TCPDF-Next 與其他主流 PHP PDF 函式庫(TCPDF、DomPDF、mPDF)的完整效能基準比較。所有測試均在相同硬體、相同 Docker 容器環境下執行,確保公平且可重現的結果。我們報告中位數而非平均值,以消除離群值干擾。當 TCPDF-Next 不是最快的,我們會誠實地指出。
測試環境
| 參數 | 數值 |
|---|---|
| CPU | Intel Core i9-13900K(x86-64) |
| 記憶體 | 64 GB DDR5(Docker 限制 16 GB) |
| Docker | 4 CPUs、16 GB RAM、Ubuntu bookworm |
| PHP | 8.5.3(CLI,OPcache 啟用,JIT 啟用) |
| TCPDF-Next | 1.6.0 |
| TCPDF-NextArtisan (Chrome) | 1.0.0 |
| TCPDF | 6.10.1 |
| DomPDF | v3.1.4 |
| mPDF | v8.2.7 |
| 暖機 | 3 次迭代(丟棄) |
| 測量 | 20 次迭代(取中位數) |
| 計時 | hrtime(true) 奈秒精度掛鐘時間 |
TIP
所有基準測試皆為自動化且可重現。基準測試套件位於儲存庫的 tests/Benchmark/ 目錄中,您可透過 Docker 自行執行。
互動式比較圖表
PHP 8.5.3 + OPcache + JIT · Docker 4 CPUs / 16 GB · i9-13900K · Median of 20 runs
產生速度
每個情境在暖機後執行 20 次。下表顯示中位數產生時間、峰值記憶體、輸出檔案大小及相對於 TCPDF-Next 的速度比較。
簡單文件(1 頁,純文字)
一頁 A4 文件,包含標題、數段文字及基本格式化。無圖片、無表格。
| 函式庫 | 時間(ms) | 峰值記憶體(MB) | 檔案大小(KB) | 相對速度 |
|---|---|---|---|---|
| TCPDF-Next | 0.63 | 4 | 3 | 基準(1.0x) |
| TCPDF | 2.50 | 12 | 7 | 3.97x 慢 |
| DomPDF | 4.07 | 12 | 2 | 6.46x 慢 |
| mPDF | 7.13 | 16 | 28 | 11.32x 慢 |
TCPDF-Next 在簡單文件情境下表現最佳,僅需 0.63 ms 即可完成產生,比 TCPDF 快近 4 倍,比 mPDF 快超過 11 倍。
發票(2 頁,表格 + 圖片)
兩頁發票,包含公司標誌、多行明細表格、小計與頁尾。
| 函式庫 | 時間(ms) | 峰值記憶體(MB) | 檔案大小(KB) | 相對速度 |
|---|---|---|---|---|
| TCPDF | 1.15 | 16 | 9 | 1.43x 快於 TCPDF-Next |
| TCPDF-Next | 1.64 | 16 | 52 | 基準(1.0x) |
| DomPDF | 19.09 | 16 | 4 | 11.64x 慢 |
| mPDF | 21.66 | 18 | 30 | 13.21x 慢 |
誠實揭露
在發票情境中,TCPDF 以 1.15 ms 的成績比 TCPDF-Next 的 1.64 ms 快約 1.4 倍。這是因為 TCPDF 在此類小型文件的低階 PDF 物件組裝上具備高度最佳化的路徑。不過,TCPDF-Next 的輸出檔案較大(52 KB vs. 9 KB),主要來自嵌入更完整的字型子集與元資料。在其餘所有情境中,TCPDF-Next 均明顯領先。
100 頁報告(密集文字)
100 頁文件,內容為密集混合內容:標題、段落及結構化資料橫跨多頁。
| 函式庫 | 時間(ms) | 峰值記憶體(MB) | 檔案大小(KB) | 相對速度 |
|---|---|---|---|---|
| TCPDF-Next | 32.39 | 18 | 96 | 基準(1.0x) |
| TCPDF | 102.47 | 18 | 101 | 3.16x 慢 |
| mPDF | 1,044.05 | 82 | 181 | 32.23x 慢 |
| DomPDF | 2,705.55 | 70 | 129 | 83.52x 慢 |
大型文件是 TCPDF-Next 優勢最為顯著的場景。以 32.39 ms 產生 100 頁報告,比 TCPDF 快 3.2 倍,比 DomPDF 快超過 83 倍。記憶體使用量與 TCPDF 相同,遠低於 DomPDF 和 mPDF。
HTML 轉 PDF
HTML → PDF(內建解析器)
使用各函式庫內建 HTML 解析引擎,將包含 CSS 樣式、表格、圖片與多欄版面的 HTML 片段轉換為 PDF。
| 函式庫 | 時間(ms) | 峰值記憶體(MB) | 檔案大小(KB) | 相對速度 |
|---|---|---|---|---|
| TCPDF-Next | 0.93 | 74 | 7 | 基準(1.0x) |
| TCPDF | 7.62 | 74 | 13 | 8.19x 慢 |
| DomPDF | 16.09 | 74 | 5 | 17.30x 慢 |
| mPDF | 33.62 | 74 | 46 | 36.15x 慢 |
TCPDF-Next 的 HTML 解析引擎交出亞毫秒級效能 — 比 TCPDF 快 8 倍,比 mPDF 快 36 倍。四套函式庫在此情境中峰值記憶體幾乎相同(74 MB),表明開銷主要由 HTML 解析基礎設施本身所主導。
HTML → PDF 搭配 Chrome 渲染(TCPDF-NextArtisan)
TCPDF-NextArtisan 透過 Chrome DevTools Protocol(CDP)使用無頭 Chrome 進行像素完美的 HTML 轉 PDF 渲染。
| 函式庫 | 時間(ms) | 峰值記憶體(MB) | 檔案大小(KB) |
|---|---|---|---|
| TCPDF-NextArtisan (Chrome CDP) | 309.85 | 74 | 37 |
309.85 ms 顯著高於 DomPDF(16.09 ms)或 mPDF(33.62 ms),但這是刻意的取捨 — 以時間換取完整的 Chrome 渲染引擎能力。
為什麼 Chrome 渲染較慢?
- Chrome Page 生命週期 — 每次渲染需要
createPage()→setViewport()→setHtml()→evaluate()→printToPDF()→close()— 多次 CDP 通訊往返 - printToPDF 開銷 — Chrome 的內建 PDF 列印引擎本身需要 ~200-300 ms(即使 HTML 很簡單)
- PDF 解析 + XObject 匯入 — 還需要解析 Chrome 產生的 PDF 並萃取 Form XObject 嵌入最終文件
速度 vs 品質的取捨
| DomPDF / mPDF | TCPDF-NextArtisan | |
|---|---|---|
| CSS 支援 | 有限(不支援 Flexbox、Grid、複雜選擇器) | 完整 CSS3(Flexbox、Grid、Web Fonts、媒體查詢、CSS 變數) |
| 渲染引擎 | 自行實作的 CSS 解析器 | Chrome Blink 引擎(像素完美) |
| 速度 | 16-34 ms | ~310 ms |
| 適用場景 | 簡單排版 | 複雜 CSS3 版面、品牌一致性要求 |
BrowserPool keep-alive 機制已在使用中,避免每次 200-500 ms 的 Chrome 啟動成本。
選擇指南
簡單 HTML(表格、基本格式)請用 TCPDF-Next 內建 HTML 解析器(0.93 ms)。需要像素完美的複雜 CSS3 版面時,使用 TCPDF-NextArtisan — ~310 ms 的額外開銷換來 Chrome 渲染引擎的完整能力。
吞吐量基準
在持續工作負載中每秒 / 每分鐘可產生的簡單文件(1 頁)數量。
單執行緒
| 函式庫 | 文件/秒 | 文件/分鐘 |
|---|---|---|
| TCPDF-Next | 2,684 | 161,014 |
| TCPDF | 1,244 | 74,626 |
| DomPDF | 260 | 15,588 |
| mPDF | 133 | 7,994 |
4 個 Workers(並行處理)
| 函式庫 | 文件/秒 | 文件/分鐘 |
|---|---|---|
| TCPDF-Next | 9,434 | 566,024 |
| TCPDF | 4,431 | 265,832 |
| DomPDF | 939 | 56,334 |
| mPDF | 484 | 29,044 |
吞吐量摘要
在單執行緒模式下,TCPDF-Next 每分鐘可產生超過 161,000 份文件,是 TCPDF 的 2.2 倍、DomPDF 的 10.3 倍、mPDF 的 20.1 倍。使用 4 個 Workers 並行處理時,吞吐量進一步提升至每分鐘超過 566,000 份文件,展現出優異的水平擴展能力。對於高量批次處理(發票、報表、對帳單產生),這些吞吐量數據直接轉化為基礎設施成本節省。
數位簽章額外負擔
新增數位簽章時的額外時間與檔案大小(其他函式庫不支援 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-Next | B-B / B-T / B-LT / B-LTA | 完整 PAdES 長期驗證支援 |
| TCPDF | 僅基礎 PKCS#7 | 不支援 PAdES 進階等級 |
| 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 更快?
效能優勢來自多項刻意的架構決策:
現代 PDF 2.0 核心 — 渲染管線從零為 PDF 2.0 打造,消除拖慢 TCPDF 的舊版相容層。交叉引用串流與物件串流同時降低 I/O 負擔與檔案大小。
JIT 友善的程式碼路徑 — 熱點迴圈與關鍵渲染方法經過結構化設計,充分利用 PHP 8 JIT 編譯器。緊湊、強型別、低分支的程式碼讓 JIT 能產生高效的機器碼。
延遲資源載入 — 字型、圖片與 ICC 色彩描述檔僅在首次使用時載入,而非在建構時。不嵌入圖片的文件零圖片處理開銷。
高效記憶體佈局 — 頁面物件經過壓縮,並透過參考計數共用資源(字型、色彩空間),即使長文件也能維持低峰值記憶體。
最佳化的 HTML 解析器 — 不同於舊版 TCPDF 的正規表達式 HTML 解析,TCPDF-Next 使用串流式標記解析器,單次掃描即可處理 HTML,回溯量極小。
可並行化設計 — 無狀態的頁面渲染架構讓工作負載可在多個 Workers 間線性擴展,如 4 Workers 近 4 倍吞吐量增幅所示。
TIP
上述最佳化在大型文件(如 100 頁報告)中效果最為顯著。對於 1-2 頁的小型文件,各函式庫的差距較小,某些情境下(如發票)傳統 TCPDF 甚至可能略快。
測試方法論
基準設計原則
- 隔離 — 每項基準測試在獨立的 PHP 程序中執行,防止交叉測試的記憶體污染
- 暖機 — 丟棄前 3 次暖機迭代後才開始正式測量,確保 OPcache 與 JIT 已完全暖機
- 迭代 — 每項測試案例 20 次測量迭代
- 統計方法 — 報告中位數(有效抵抗離群值干擾),而非平均值
- 記憶體測量 — 使用
memory_get_peak_usage(true)取 RSS 對齊的峰值記憶體 - 時間測量 — 使用
hrtime(true)提供奈秒精度的掛鐘時間,避免microtime()的時鐘漂移問題 - 檔案大小 — 輸出寫入暫存檔案後以
filesize()測量 - 環境一致 — 所有函式庫在相同 Docker 容器中執行,使用相同的 PHP 設定、CPU 限制與記憶體限制
公平性聲明
我們致力於提供公正的基準測試結果。所有函式庫均使用其最新穩定版本,並啟用各自建議的最佳化設定。基準測試原始碼完全公開,任何人都可以檢視、質疑或重現我們的結果。如同上文所述,在發票情境中 TCPDF 確實比 TCPDF-Next 更快,我們不會迴避對自身不利的數據。
重現基準測試
基準測試套件包含在儲存庫中。您可以使用 Docker 在自己的機器上重現所有結果:
# 複製儲存庫
git clone https://github.com/YeeeFang/tcpdf-next.git
cd tcpdf-next
# 使用 Docker 建置基準測試環境
docker build -t tcpdf-benchmark -f docker/benchmark/Dockerfile .
# 執行完整基準測試套件
docker run --rm \
--cpus=4 \
--memory=16g \
tcpdf-benchmark
# 執行特定基準測試
docker run --rm \
--cpus=4 \
--memory=16g \
tcpdf-benchmark \
--filter=InvoiceBench
# 或使用 Composer(非 Docker 環境)
composer install
composer run benchmark
# 產生基準測試報告
composer run benchmark:reportTIP
為確保結果可重現,建議使用上述 Docker 指令,以與本頁面相同的硬體限制(4 CPUs、16 GB RAM)執行測試。在不同硬體上,絕對數值會有所不同,但函式庫間的相對差距應保持一致。結果會在執行結束時輸出至 stdout。Docker 設定確保環境一致,不受主機作業系統影響。