Skip to content

パフォーマンスベンチマーク

このページでは、TCPDF-Next を TCPDF、DomPDF、mPDF と同一条件で比較した実測ベンチマーク結果を掲載しています。すべてのテストは同一の Docker コンテナ内で実行し、公正な比較を保証しています。各シナリオで 3 回のウォームアップ(破棄)を行った後、20 回の測定を実施し中央値を報告しています。TCPDF-Next が最速でないケースについても正直に開示しています。

テスト環境

パラメータ
CPUIntel Core i9-13900K(x86-64)
RAM64 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

すべてのベンチマークは 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 回ずつ測定し、中央値の生成時間(ミリ秒)・ピークメモリ(MB)・出力ファイルサイズ(KB)を報告します。値が小さいほど高速・高効率です。

シンプルドキュメント(1 ページ)

見出し・3 段落のテキスト・基本的なフォーマットを含む単一の A4 ページです。画像やテーブルは含みません。

ライブラリ時間(ms)ピークメモリ(MB)ファイルサイズ(KB)相対速度
TCPDF-Next0.6343基準(1.0x)
TCPDF2.501273.97x 遅い
DomPDF4.071226.46x 遅い
mPDF7.13162811.32x 遅い

TCPDF-Next は最もシンプルなシナリオを 1 ms 未満で完了します。TCPDF の約 4 倍、DomPDF の約 6.5 倍、mPDF の約 11 倍の速度です。

請求書(2 ページ)

ロゴ画像・テーブル・小計計算・ヘッダー/フッターを含む典型的なビジネス請求書です。

ライブラリ時間(ms)ピークメモリ(MB)ファイルサイズ(KB)相対速度
TCPDF1.151691.43x 高速
TCPDF-Next1.641652基準(1.0x)
DomPDF19.0916411.64x 遅い
mPDF21.66183013.21x 遅い

正直な報告

請求書シナリオでは TCPDF が TCPDF-Next より約 1.4 倍高速(1.15 ms vs 1.64 ms)でした。TCPDF はこの種の小規模テーブルレイアウトに対して長年にわたり最適化されてきたレガシーテーブルレンダラーを持っており、このシナリオではわずかに優位に立ちます。ただし、両者ともに 2 ms 未満であり実務上の体感差はほぼありません。DomPDF と mPDF はいずれも 10 倍以上遅い結果となっています。

100 ページレポート

見出し・段落・画像・ヘッダー/フッターを含む混合コンテンツの大規模レポートです。

ライブラリ時間(ms)ピークメモリ(MB)ファイルサイズ(KB)相対速度
TCPDF-Next32.391896基準(1.0x)
TCPDF102.47181013.16x 遅い
mPDF1,044.058218132.23x 遅い
DomPDF2,705.557012983.52x 遅い

100 ページレポートは TCPDF-Next の優位性が最も顕著になるシナリオです。32.39 ms で完了し、TCPDF の約 3.2 倍、DomPDF の約 83.5 倍高速です。ページ数が増えるほどその差は拡大します。メモリ使用量でも TCPDF-Next と TCPDF は 18 MB に留まる一方、DomPDF は 70 MB、mPDF は 82 MB を消費します。

HTML → PDF(内蔵パーサー)

各ライブラリの内蔵 HTML パーサーを使用して HTML マークアップを PDF に変換するシナリオです。

ライブラリ時間(ms)ピークメモリ(MB)ファイルサイズ(KB)相対速度
TCPDF-Next0.93747基準(1.0x)
TCPDF7.6274138.19x 遅い
DomPDF16.0974517.30x 遅い
mPDF33.62744636.15x 遅い

TCPDF-Next の HTML パーサーは 1 ms 未満で処理を完了します。TCPDF の約 8 倍、mPDF の約 36 倍の速度です。4 つのライブラリすべてがほぼ同等のピークメモリ(74 MB)を消費しており、HTML パーシングインフラストラクチャ自体のオーバーヘッドが支配的であることを示しています。

HTML → PDF(Chrome レンダリング — TCPDF-NextArtisan)

TCPDF-NextArtisan は Chrome ブラウザエンジンを利用して HTML を PDF に変換する方式です。内蔵パーサーとは異なり、CSS Grid・Flexbox・Web フォントなどフルブラウザの描画機能を活用できます。

方式時間(ms)ピークメモリ(MB)ファイルサイズ(KB)
TCPDF-Next(内蔵パーサー)0.93747
TCPDF-NextArtisan(Chrome)309.857437

Chrome レンダリングが遅い理由

Artisan の Chrome レンダリングは内蔵パーサーと比較して約 300 倍の時間を要します。これは以下の要因によるものです。

  1. Chrome Page ライフサイクルオーバーヘッド — Chrome DevTools Protocol(CDP)を介した複数回の往復通信が発生します
  2. printToPDF 自体のコスト — Chrome 側の PDF レンダリングに約 200〜300 ms を要します
  3. PDF 解析 + XObject インポート — Chrome が出力した PDF を解析し、XObject としてインポートする追加処理が必要です
  4. 速度 vs 品質のトレードオフ — DomPDF や mPDF は CSS の対応範囲に制限がありますが、Artisan はピクセルパーフェクトな出力を実現します。複雑なダッシュボードやメール HTML テンプレートなど、高い CSS 忠実度が求められるシナリオで真価を発揮します
  5. BrowserPool keep-alive 使用済み — ブラウザプロセスの再利用による最適化が適用された状態でのこの数値です

速度が最優先の場合は内蔵パーサーを、レイアウトの正確さが最優先の場合は Artisan(Chrome)をお選びください。

生成速度まとめ

シナリオTCPDF-NextTCPDFDomPDFmPDF
シンプルドキュメント0.63 ms2.50 ms4.07 ms7.13 ms
請求書1.64 ms1.15 ms19.09 ms21.66 ms
100 ページレポート32.39 ms102.47 ms2,705.55 ms1,044.05 ms
HTML → PDF(内蔵)0.93 ms7.62 ms16.09 ms33.62 ms
HTML → PDF(Chrome)309.85 ms

ピークメモリ使用量

各シナリオでの memory_get_peak_usage(true) による RSS ピークメモリ消費量(MB)を比較します。値が小さいほどメモリ効率が高いことを意味します。

シナリオTCPDF-NextTCPDFDomPDFmPDF
シンプルドキュメント4 MB12 MB12 MB16 MB
請求書16 MB16 MB16 MB18 MB
100 ページレポート18 MB18 MB70 MB82 MB
HTML → PDF(内蔵)74 MB74 MB74 MB74 MB
HTML → PDF(Chrome)74 MB

シンプルドキュメントでは TCPDF-Next のメモリ消費量が他ライブラリの 1/3〜1/4 に抑えられています。100 ページレポートでは DomPDF(70 MB)・mPDF(82 MB)が大量のメモリを消費する一方、TCPDF-Next と TCPDF はともに 18 MB で済みます。HTML → PDF シナリオでは全ライブラリがほぼ同等の 74 MB を消費しており、HTML パーシングの DOM ツリー構造のオーバーヘッドがライブラリ間の差異を相殺していることがわかります。

出力ファイルサイズ

生成された PDF のファイルサイズ(KB)を比較します。値が小さいほどコンパクトです。

シナリオTCPDF-NextTCPDFDomPDFmPDF
シンプルドキュメント3 KB7 KB2 KB28 KB
請求書52 KB9 KB4 KB30 KB
100 ページレポート96 KB101 KB129 KB181 KB
HTML → PDF(内蔵)7 KB13 KB5 KB46 KB
HTML → PDF(Chrome)37 KB

ファイルサイズはシナリオによって結果が異なります。シンプルドキュメントと請求書では DomPDF が最小のファイルを生成します。これは DomPDF が最小限のメタデータと簡素化された PDF 構造を使用しているためです。一方、大規模ドキュメント(100 ページレポート)では TCPDF-Next が最小となり、PDF 2.0 のバイナリクロスリファレンスストリームとオブジェクトストリーム圧縮の効果が表れています。mPDF は全シナリオで最大のファイルサイズとなりました。

スループット

シンプルドキュメント(1 ページ)の連続生成における秒間・分間処理数を計測しました。

シングルスレッド

ライブラリドキュメント/秒ドキュメント/分
TCPDF-Next2,684161,014
TCPDF1,24474,626
DomPDF26015,588
mPDF1337,994

4 ワーカー(並列処理)

ライブラリドキュメント/秒ドキュメント/分
TCPDF-Next9,434566,024
TCPDF4,431265,832
DomPDF93956,334
mPDF48429,044

TCPDF-Next はシングルスレッドで毎秒 2,684 件、4 ワーカー並列で毎秒 9,434 件 の PDF を生成できます。これは TCPDF の約 2.2 倍、DomPDF の約 10 倍、mPDF の約 20 倍のスループットです。4 ワーカー時のスケーリング効率は約 3.5 倍であり、ほぼリニアにスケールしています。大量の PDF 生成が求められるエンタープライズ環境(請求書、レポート、明細書の一括生成など)では、このスループットの差がインフラコストの削減に直結します。

デジタル署名オーバーヘッド(PAdES)

TCPDF-Next は PAdES(PDF Advanced Electronic Signatures)に対応しています。10 ページのドキュメントを各 PAdES レベルで署名した際の追加コストを示します。他のライブラリは PAdES 署名をサポートしていないため比較対象には含まれていません。

署名レベル追加時間(ms)追加ファイルサイズ(KB)説明
PAdES B-B+15+5〜8基本署名(CMS 署名内蔵)
PAdES B-T+120*+8〜12信頼できるタイムスタンプを付加
PAdES B-LT+250*+15〜50長期検証データ内蔵(証明書チェーン + OCSP/CRL)
PAdES B-LTA+350*+20〜60アーカイブタイムスタンプ付加(長期保存用)

* TSA / OCSP サーバーへのネットワーク往復を含みます。実際の時間はサーバーレイテンシとネットワーク条件に依存します。

INFO

PAdES B-B は基本署名のみでネットワーク呼び出しを必要としないため、オフライン環境でも使用できます。B-T 以上のレベルでは TSA サーバーへの接続が必要です。

PDF/A-4 アーカイブオーバーヘッド

標準 PDF 2.0 出力と比較した、PDF/A-4(ISO 19005-4)準拠出力生成のオーバーヘッドです。

構成要素追加サイズ
sRGB ICC プロファイル+3 KB
XMP メタデータ+2〜5 KB
アウトプットインテント+1〜3 KB
完全フォント埋め込み(必要な場合)フォントごとに +50〜500 KB
一般的な合計オーバーヘッド+10〜50 KB
生成時間オーバーヘッド< 5%

TIP

PDF/A-4 モードでもデフォルトでフォントサブセット化が使用されます。オーバーヘッドの大部分は ICC プロファイルと拡張メタデータによるものであり、ほとんどのドキュメントでは無視できる程度です。

TCPDF-Next が高速な理由

TCPDF-Next のパフォーマンス上の優位性は、以下のアーキテクチャ上の決定に基づいています。

1. PHP 8.5+ 最適化

TCPDF-Next は PHP 8.5 の JIT コンパイラを最大限に活用しています。ホットパスのコードはネイティブマシンコードにコンパイルされ、インタプリタのオーバーヘッドが除去されます。readonly プロパティ・enum・Fiber など最新言語機能を活用してランタイム効率を最大化しています。

2. PDF 2.0 バイナリクロスリファレンスストリーム

レガシー PDF 1.x のテキストベースクロスリファレンステーブルに代わり、バイナリストリームを使用します。これによりパース速度が向上し、ファイルサイズが削減されます。

3. ストリーミング出力アーキテクチャ

大規模ドキュメント生成時、完了したページを即座に出力バッファにフラッシュします。ドキュメント全体をメモリ上に保持しないため、数百ページのドキュメントでもメモリ使用量が安定的に維持されます。

4. 現代化された HTML パーサー

レガシー TCPDF の正規表現ベース HTML パーサーを完全に書き直しました。SAX スタイルのイベント駆動パーサーを使用し、HTML → PDF 変換速度が 8 倍以上向上しています。

5. 効率的なフォントサブセット化

使用グリフのみを埋め込む最適化されたサブセット化アルゴリズムにより、ファイルサイズを最小化します。CJK フォントでも数百 KB レベルのサブセットのみを埋め込みます。

6. 並列化対応設計

ステートレスなページレンダリングアーキテクチャにより、ワークロードを複数ワーカー間でリニアにスケールさせることができます。4 ワーカーで約 3.5 倍のスループット向上がこれを実証しています。

テスト方法論

ベンチマークの公正性と再現性を保証するために、以下の方法論に従っています。

項目詳細
隔離環境Docker コンテナ(4 CPUs、16 GB RAM)内で実行し、ホストシステムの影響を排除しています。
ウォームアップ各テスト前に 3 回のウォームアップを実行し結果を破棄します。これにより OPcache・JIT のウォームアップ、ファイルシステムキャッシュ、PHP 内部最適化が安定化されます。
測定回数20 回の測定後、中央値を報告します。中央値は外れ値の影響を受けにくいため、平均値より信頼性が高くなります。
時間計測hrtime(true) によるナノ秒精度のウォールクロック時間を使用します。microtime() のクロックドリフト問題を回避します。
メモリ計測memory_get_peak_usage(true) で実際に割り当てられた RSS ピークメモリを測定します。
ファイルサイズディスクに書き込んだ後の最終 PDF ファイルサイズを filesize() で測定します。OS レベルのフラッシュを含みます。
同一入力すべてのライブラリが同一の入力データ(テキスト・画像・HTML)を使用します。
GC各テスト前に gc_collect_cycles() を実行し、ガベージコレクションの影響を排除します。
公正な設定各ライブラリのデフォルト設定を使用します。特定ライブラリに有利なチューニングは一切適用していません。

公正性に関する声明

私たちは公正なベンチマーク結果を提供することに尽力しています。すべてのライブラリは最新の安定版を使用し、各自が推奨する最適化設定を有効にしています。ベンチマークのソースコードは完全に公開されており、どなたでも検証・質問・再現が可能です。上述のとおり、請求書シナリオでは TCPDF が TCPDF-Next より高速であることを正直に報告しており、自身に不利なデータを隠すことはいたしません。

ベンチマークの再現

以下の Docker コマンドで、お手元の環境でベンチマークを再現できます。

bash
# リポジトリのクローン
git clone https://github.com/nicholasgasior/tcpdf-next.git
cd tcpdf-next

# Docker イメージのビルド
docker build -t tcpdf-bench -f benchmark/Dockerfile .

# 全ベンチマークの実行(4 CPUs、16 GB RAM 制限)
docker run --rm \
  --cpus=4 \
  --memory=16g \
  tcpdf-bench

# 特定シナリオのみ実行
docker run --rm --cpus=4 --memory=16g tcpdf-bench \
  php benchmark/run.php --filter=SimpleDocument

# 結果を JSON でエクスポート
docker run --rm --cpus=4 --memory=16g tcpdf-bench \
  php benchmark/run.php --format=json > results.json

# 結果を CSV でエクスポート
docker run --rm --cpus=4 --memory=16g tcpdf-bench \
  php benchmark/run.php --format=csv > results.csv

Composer でも実行可能です

Docker を使わない場合は、PHP 8.5 以上の環境で以下のコマンドでも実行できます。

bash
composer install
composer run benchmark

INFO

本ページと同一の結果を再現するには、上記の Docker コマンドで同じハードウェア制限(4 CPUs、16 GB RAM)で実行することを推奨します。異なるハードウェアでは絶対値は変動しますが、ライブラリ間の相対差はほぼ一貫します。

関連ドキュメント

LGPL-3.0-or-later ライセンスの下で公開されています。