성능 벤치마크
Office Oxide는 11개의 독립 공개 테스트 스위트 — LibreOffice Core, Apache POI, Open XML SDK, ClosedXML, Pandoc, python-docx/python-pptx, Apache Tika, calamine, openpreserve, oletools, LibreOffice legacy 코퍼스 — 에서 가져온 6,062개 파일로 벤치마크되었습니다.
방법론: 단일 스레드, LTO 포함 release 빌드, 워밍된 디스크 캐시(steady-state), idle 시스템에서 3회 실행의 중간값.
DOCX — 2,538개 파일
| 라이브러리 | 언어 | 평균 | p99 | 통과율 | 라이선스 |
|---|---|---|---|---|---|
| office_oxide | Rust | 0.8 ms | 3.9 ms | 98.9% | MIT |
| python-docx | Python | 11.8 ms | 98 ms | 95.1% | MIT |
Office Oxide는 python-docx보다 평균 14배 빠르고 꼬리(p99)에서 25배 빠릅니다. 통과율도 3.8%p 높습니다.
XLSX — 1,802개 파일
| 라이브러리 | 언어 | 평균 | p99 | 통과율 | 라이선스 |
|---|---|---|---|---|---|
| office_oxide | Rust | 5.0 ms | 40 ms | 97.8% | MIT |
| python-calamine | Rust/Python | 13.9 ms | 183 ms | 96.6% | MIT |
| openpyxl | Python | 94.5 ms | 698 ms | 96.2% | MIT |
Office Oxide는 calamine보다 2.8배 빠르고(다음으로 빠른 XLSX 라이브러리) openpyxl보다 18배 빠릅니다. 셋 중 통과율도 가장 높습니다.
PPTX — 806개 파일
| 라이브러리 | 언어 | 평균 | p99 | 통과율 | 라이선스 |
|---|---|---|---|---|---|
| office_oxide | Rust | 0.7 ms | 3.9 ms | 98.4% | MIT |
| python-pptx | Python | 32.5 ms | 174 ms | 86.7% | MIT |
Office Oxide는 python-pptx보다 46배 빠르고, 통과율은 11.7%p 높습니다. python-pptx는 예상한 스키마에서 벗어난 PowerPoint 파일에 약하지만, office_oxide는 그것들을 투명하게 처리합니다.
레거시 형식 — 916개 파일
JVM(Apache Tika)이나 외부 바이너리(catdoc, antiword) 없이 .doc, .xls, 그리고 .ppt를 모두 읽는 다른 Rust/Python 라이브러리는 없습니다.
.doc — 246개 파일
| 라이브러리 | 평균 | p99 | 통과율 | 라이선스 |
|---|---|---|---|---|
| office_oxide | 0.3 ms | 3.4 ms | 94.7% | MIT |
| catdoc | 4.3 ms | 41 ms | 90.2% | GPL-2.0 |
| antiword | 4.5 ms | 66 ms | 76.8% | GPL-2.0 |
.xls — 494개 파일
| 라이브러리 | 평균 | p99 | 통과율 | 라이선스 |
|---|---|---|---|---|
| office_oxide | 2.8 ms | 75 ms | 99.2% | MIT |
| xls2csv (catdoc) | 6.9 ms | 58 ms | 84.0% | GPL-2.0 |
| python-calamine | 9.0 ms | 96 ms | 90.7% | MIT |
| xlrd | 36.6 ms | 503 ms | 93.1% | BSD-3 |
xls2csv는 p99가 더 좁습니다(58 ms vs 75 ms). 복잡한 시트에서 잘리거나 손실 있는 출력을 내기 때문입니다. Office Oxide는 평균에서 2.4배 빠르고 코퍼스의 15%p를 더 통과시킵니다.
.ppt — 176개 파일
| 라이브러리 | 평균 | p99 | 통과율 | 라이선스 |
|---|---|---|---|---|
| office_oxide | 0.7 ms | 6.6 ms | 100% | MIT |
| catppt (catdoc) | 2.8 ms | 8 ms | 77.8% | GPL-2.0 |
통과율 — 6,062개 파일에서 98.4%
97개의 미통과 파일은 모두 잘못된 입력입니다:
| 범주 | 수 | 비고 |
|---|---|---|
| 잘못된 ZIP / CFB 아카이브 | 43 | 잘림, EOCD 누락, CFB 매직 불량 |
| 필수 파트 누락 | 21 | 암호화, 비밀번호 보호, 또는 스트림 누락 |
| 손상된 XML | 18 | XML 폭탄, ill-formed 태그, fuzz 손상 콘텐츠 |
| 잘못된 CFB 헤더 | 15 | WordPerfect / IBM DisplayWrite / Excel 3/4가 .doc/.xls로 잘못 명명, CVE 익스플로잇 픽스처 |
합법적인 Word 97+ / Excel 97+ / PowerPoint 97+ 파일에서 실패 0건. 유효 문서에서 panic 0, 타임아웃 0, false negative 0.
코퍼스
| 출처 | 파일 | 라이선스 |
|---|---|---|
| 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을 떼고 싶을 때