Бенчмарки производительности
Office Oxide бенчмаркается на 6 062 файлах, собранных из 11 независимых публичных тестовых наборов — LibreOffice Core, Apache POI, Open XML SDK, ClosedXML, Pandoc, python-docx/python-pptx, Apache Tika, calamine, openpreserve, oletools и LibreOffice legacy corpus.
Методика: один поток, release-сборка с LTO, тёплый дисковый кеш (steady-state), медиана из трёх запусков на idle-системе.
DOCX — 2 538 файлов
| Библиотека | Язык | Среднее | p99 | Pass rate | Лицензия |
|---|---|---|---|---|---|
| office_oxide | Rust | 0,8 мс | 3,9 мс | 98,9% | MIT |
| python-docx | Python | 11,8 мс | 98 мс | 95,1% | MIT |
Office Oxide в 14 раз быстрее python-docx по среднему и в 25 раз быстрее на хвосте (p99). Pass rate выше на 3,8 п. п.
XLSX — 1 802 файла
| Библиотека | Язык | Среднее | p99 | Pass rate | Лицензия |
|---|---|---|---|---|---|
| office_oxide | Rust | 5,0 мс | 40 мс | 97,8% | MIT |
| python-calamine | Rust/Python | 13,9 мс | 183 мс | 96,6% | MIT |
| openpyxl | Python | 94,5 мс | 698 мс | 96,2% | MIT |
Office Oxide в 2,8 раза быстрее calamine (следующая по скорости XLSX-библиотека) и в 18 раз быстрее openpyxl. И самый высокий pass rate из трёх.
PPTX — 806 файлов
| Библиотека | Язык | Среднее | p99 | Pass rate | Лицензия |
|---|---|---|---|---|---|
| office_oxide | Rust | 0,7 мс | 3,9 мс | 98,4% | MIT |
| python-pptx | Python | 32,5 мс | 174 мс | 86,7% | MIT |
Office Oxide в 46 раз быстрее python-pptx, pass rate выше на 11,7 п. п. python-pptx плохо переваривает PowerPoint-файлы, отклоняющиеся от ожидаемой схемы; office_oxide справляется прозрачно.
Legacy-форматы — 916 файлов
Никакая другая Rust/Python-библиотека не читает .doc, .xls и .ppt без JVM (Apache Tika) или внешних бинарей (catdoc, antiword).
.doc — 246 файлов
| Библиотека | Среднее | p99 | Pass rate | Лицензия |
|---|---|---|---|---|
| office_oxide | 0,3 мс | 3,4 мс | 94,7% | MIT |
| catdoc | 4,3 мс | 41 мс | 90,2% | GPL-2.0 |
| antiword | 4,5 мс | 66 мс | 76,8% | GPL-2.0 |
.xls — 494 файла
| Библиотека | Среднее | p99 | Pass rate | Лицензия |
|---|---|---|---|---|
| office_oxide | 2,8 мс | 75 мс | 99,2% | MIT |
| xls2csv (catdoc) | 6,9 мс | 58 мс | 84,0% | GPL-2.0 |
| python-calamine | 9,0 мс | 96 мс | 90,7% | MIT |
| xlrd | 36,6 мс | 503 мс | 93,1% | BSD-3 |
У xls2csv p99 теснее (58 мс против 75 мс), потому что он отдаёт усечённый/lossy-вывод на сложных листах. Office Oxide в 2,4 раза быстрее по среднему и пропускает на 15 п. п. больше корпуса.
.ppt — 176 файлов
| Библиотека | Среднее | p99 | Pass rate | Лицензия |
|---|---|---|---|---|
| office_oxide | 0,7 мс | 6,6 мс | 100% | MIT |
| catppt (catdoc) | 2,8 мс | 8 мс | 77,8% | GPL-2.0 |
Pass rate — 98,4% по 6 062 файлам
97 непрошедших файлов — все невалидные входы:
| Категория | Количество | Заметки |
|---|---|---|
| Невалидный ZIP / CFB-архив | 43 | Усечения, отсутствует EOCD, плохой CFB magic |
| Отсутствует обязательная часть | 21 | Зашифровано, под паролем или нет stream |
| Поломанный XML | 18 | XML-бомбы, ill-formed-теги, fuzz-corrupt контент |
| Невалидный CFB-заголовок | 15 | WordPerfect / IBM DisplayWrite / Excel 3/4, обозванные как .doc/.xls, CVE-эксплойт-fixtures |
Ноль провалов на легитимных Word 97+ / Excel 97+ / PowerPoint 97+ файлах. Ноль panic, ноль таймаутов, ноль false negative на валидных документах.
Корпус
| Источник | Файлы | Лицензия |
|---|---|---|
| LibreOffice Core | 2 185 | MPL-2.0 |
| Apache POI | 1 298 | Apache-2.0 |
| Open XML SDK | 707 | MIT |
| ClosedXML | 371 | MIT |
| Pandoc | 224 | GPL-2.0 |
| python-docx + python-pptx | 111 | MIT |
| Apache Tika | 108 | Apache-2.0 |
| calamine | 28 | MIT |
| openpreserve | 20 | CC0 |
| oletools | 17 | BSD-2 |
| LibreOffice (legacy) | 12 | MPL-2.0 |
| Итого | 6 062 |
Воспроизводимые бенчмарки в bench_rust/ и bench_python.py. Полная методика и пофайловый разбор — в BENCHMARKS.md.
Смотрите также
- vs python-docx — миграция DOCX
- vs openpyxl — миграция XLSX
- vs python-pptx — миграция PPTX
- vs Apache Tika — когда хочется убрать JVM