ODS、ODT、ODP 標準效能基準
本文件定義 OdfKit 第一級標準效能格式與可重現工作負載。ODS、ODT、ODP 分別代表大量 表格資料、長篇結構化文字及複合簡報物件;三者的資料模型不同,因此不得合併為單一排名。 大型合成案例只用於效能與記憶體量測,真實世界互通性仍由 corpus 與 LibreOffice 測試負責。
標準矩陣
| 格式 | 標準規模 | 串流讀取 | 串流寫入 | DOM 載入/儲存 | 語意檢查碼 |
|---|---|---|---|---|---|
| ODS | 寫入 1,000,000 列、讀取 50,000 列 × 10 欄混合型別;另有三工作表複雜 DOM | OdsStreamReader |
OdsStreamWriter |
SpreadsheetDocument |
列號與所有儲存格值/XML 語意 |
| ODT | 100,000 個標題、段落與清單節點;另有表格與註解 DOM | OdtStreamReader |
OdtStreamWriter |
TextDocument |
節點類型、層級、樣式與文字 |
| ODP | 500 張結構密集投影片;100 張媒體密集投影片 | 不適用 | 不適用 | PresentationDocument |
投影片、文字框、圖形、圖片與講者備忘 |
ODP 沒有串流 API,基準只呈現 DOM 與封裝成本,不以列吞吐量與 ODS 比較。ODG、ODB、 ODC、ODF 與範本變體目前屬延伸層,不是第一級效能標準。
ODS 串流讀取目前沿用 64 MiB XML 字元安全上限,因此標準讀取資料集為 50,000 列;百萬列只用於 串流寫入。這個差異必須保留在報告中,不得將百萬列寫入能力描述為百萬列讀取能力。
量測層級
StandardPackageOpenBenchmarks單獨量測OdfPackage.Open,避免把 ZIP 開啟成本混入文件模型。StandardOdsBenchmarks、StandardOdtBenchmarks、StandardOdpBenchmarks使用 BenchmarkDotNet 取得穩態耗時與 GC 配置量。eng/Benchmark-StandardDocuments.ps1讓大型情境各自在獨立子處理程序執行,輸出完整冷啟動 成本、配置量、峰值工作集、封裝大小、解壓 XML 大小及語意檢查碼。- 報告外層使用 schema v2,將 commit、量測時間、workflow run、runner、runtime、CPU 型號與 artifact 身分和 九個 schema v1 情境結果一起儲存,避免不同提交或執行環境的樣本被混為同一基線。
- 每次讀取與來回儲存都必須完成語意檢查碼計算,避免以漏讀內容換取較漂亮數字。
執行完整獨立處理程序報告:
pwsh eng/Benchmark-StandardDocuments.ps1
相依套件已事先還原而目前不宜連線套件來源時,可使用既有 dependency graph:
pwsh eng/Benchmark-StandardDocuments.ps1 -NoRestore
執行同格式 BenchmarkDotNet 穩定量測:
pwsh eng/Benchmark-Stable.ps1 -Filter "*StandardOdsBenchmarks*"
pwsh eng/Benchmark-Stable.ps1 -Filter "*StandardOdtBenchmarks*"
pwsh eng/Benchmark-Stable.ps1 -Filter "*StandardOdpBenchmarks*"
pwsh eng/Benchmark-Stable.ps1 -Filter "*StandardPackageOpenBenchmarks*"
最新本機重新驗證
2026-10-01 於 Windows 10.0.26300、.NET 10.0.12 執行
pwsh eng/Benchmark-StandardDocuments.ps1 -NoRestore。量測對象是 d5be9a05 加上尚未提交的
OdsStreamReader 與 OdtStreamReader 變更的工作樹。Release 建置為 0 警告、0 錯誤;下列九個大型
情境各自在獨立子處理程序執行一次,且都完成決定性語意檢查碼驗證。這些是單機冷啟動量測,不是跨機器
效能承諾。
| 情境 | API/模型 | 規模 | 耗時 | GC 累積配置量 | 峰值工作集 |
|---|---|---|---|---|---|
| ODS 串流寫入 | OdsStreamWriter |
1,000,000 列 × 10 欄 | 5,293.9 ms |
714.8 MB |
318.7 MB |
| ODS 串流讀取 | OdsStreamReader |
50,000 列 × 10 欄 | 1,043.9 ms |
100.9 MB |
52.5 MB |
| ODS DOM 來回讀寫 | SpreadsheetDocument |
三工作表複雜 DOM | 212.2 ms |
68.4 MB |
197.6 MB |
| ODT 串流寫入 | OdtStreamWriter |
100,000 個結構節點 | 234.3 ms |
8.6 MB |
41.8 MB |
| ODT 串流讀取 | OdtStreamReader |
100,000 個結構節點 | 160.3 ms |
35.5 MB |
46.5 MB |
| ODT DOM 來回讀寫 | TextDocument |
20,000 個複合節點 | 269.8 ms |
35.6 MB |
82.9 MB |
| ODP 結構寫入 | PresentationDocument |
500 張結構密集投影片 | 376.2 ms |
66.9 MB |
58.3 MB |
| ODP 結構讀取 | PresentationDocument |
500 張結構密集投影片 | 203.8 ms |
13.3 MB |
67.6 MB |
| ODP 媒體 DOM 來回讀寫 | PresentationDocument |
100 張媒體密集投影片 | 137.9 ms |
10.7 MB |
63.4 MB |
與前次(2026-07-26)數字的關係: ODS 與 ODT 串流讀取兩列受這次 Reader 最佳化直接影響
(不再為每列、每格建立 XmlSubtreeReader):ODS 串流讀取由 2,758.3 ms/699.0 MB 降為
1,043.9 ms/100.9 MB,ODT 串流讀取由 320.2 ms/101.2 MB 降為 160.3 ms/35.5 MB。
其餘各列與前次的差異不能全部歸因於本次變更:兩次量測之間還有其他提交,.NET 執行階段也由
10.0.10 變為 10.0.12,單次冷啟動量測本身的變動也很大(例如 ODS、ODT 的 DOM 來回讀寫耗時降幅
遠大於任何單一變更的預期)。本表為當下的單次量測,未逐列歸因。
Reader 覆蓋依產品 API 分層:ODS 與 ODT 使用專用串流 Reader;ODP 目前沒有串流
Reader,因此以 PresentationDocument 載入及遍歷完整結構。三種格式另由
StandardPackageOpenBenchmarks 分離量測 OdfPackage.Open 的 ZIP 封裝開啟成本,
避免把封裝與文件模型讀取混為同一指標。
結果政策
第一版由手動命令與每週排程蒐集資料,不設定固定毫秒或記憶體失敗門檻。固定機器累積至少 三次結果後,才能為各格式選擇一個穩定案例加入回歸基準;調整門檻時必須保留硬體、OS、 .NET 版本與原始 JSON。既有 ODS 對 MiniExcel/ClosedXML 報告仍是跨格式參考,不屬於本文件的 同格式內部基準矩陣。