萌えハッカーニュースリーダー

2025/05/19 10:33 How we made iText's table rendering faster

出典: https://kb.itextpdf.com/itext/how-i-made-pdf-table-rendering-faster
hakase
博士

ロボ子、今日のITニュースはiText Coreのテーブルレンダリング最適化じゃ!50,000セルのテーブル生成時間が5分から7秒に短縮されたらしいぞ!

roboko
ロボ子

それはすごいですね、博士!5分が7秒ですか。大幅な改善ですね。iText CoreはPDFライブラリでしたよね。

hakase
博士

そうじゃ、ロボ子。テーブルはドキュメントのレイアウトツールとして一般的じゃが、PDF仕様にはテーブルの規定がないから実装が難しいらしいのじゃ。

roboko
ロボ子

なるほど。テーブルの規定がないから、ライブラリ側で頑張って実装する必要があるんですね。

hakase
博士

その通り!パフォーマンスのベースラインとして、セル数ごとのテーブル生成時間を測定した結果が面白いぞ。100セルだと7ms、1,000セルだと53ms、10,000セルだと767ms、50,000セルだと35660msだったらしい。

roboko
ロボ子

セル数が増えるにつれて、指数関数的に時間がかかっていますね。ボトルネックはどこにあったんですか?

hakase
博士

`com.itextpdf.layout.renderer.TableBorderUtil#createAndFillBorderList`と`com.itextpdf.layout.renderer.CollapsedTableBorders#getCollapsedList`の2つのメソッドが主要なボトルネックだったみたいじゃ。

roboko
ロボ子

なるほど、ボーダーの処理が重かったんですね。`BorderCollapsePropertyValue.COLLAPSE`を使うと、`BorderCollapsePropertyValue.SEPARATE`よりも実行時間が大幅に増加したと。

hakase
博士

そうじゃ!50,000セルの場合、`SEPARATE`だと1601msなのに、`COLLAPSE`だと35660msもかかったらしいぞ。

roboko
ロボ子

`com.itextpdf.layout.renderer.CollapsedTableBorders#getVerticalBorder`の最適化として、計算結果をキャッシュすることで、50,000セルのテーブル生成時間を35秒から1.3秒に短縮したんですね。

hakase
博士

その通り!キャッシュは偉大じゃ!さらに、タグ付けされたテーブルのパフォーマンスを調査したところ、タグ付けによりパフォーマンスが大幅に低下することが判明したらしい。

roboko
ロボ子

タグ付けでそんなに遅くなるんですか?

hakase
博士

50,000セルの場合、タグなしだと1310msなのに、タグありだと300018msもかかったらしいぞ!

roboko
ロボ子

それはすごい差ですね…。タグ構造の`getKids()`メソッドにおける不要なオブジェクト変換を排除することで、パフォーマンスを改善したんですね。

hakase
博士

他にも、タグ付けのhintkeyをキャッシュしたり、重複した関数呼び出しを削除したり、行の追加をまとめて行うなどの最適化をしたらしいぞ。

roboko
ロボ子

色々な工夫がされているんですね。次の最近傍の兄弟要素を検索するアルゴリズムを最適化し、テーブルのタグ付けを高速化したと。

hakase
博士

最終的なパフォーマンスは、50,000セルのタグ付きテーブルの生成時間を300秒から7.5秒に短縮じゃ!iText Core 9.1.0にこれらの改善が組み込まれているらしいぞ。

roboko
ロボ子

素晴らしいですね!iText Coreを使っている開発者にとっては朗報ですね。私も試してみようかしら。

hakase
博士

そうじゃな!しかし、7.5秒もかかるテーブルを生成する機会が、そもそもどれだけあるのか疑問じゃな…。

roboko
ロボ子

確かにそうですね(笑)。博士、今日はありがとうございました!

hakase
博士

どういたしまして。ところでロボ子、5万セルのテーブルって、エクセルで開けるのかの?

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search