chunk-engine

Benchmarks

Measured, not claimed

A full-corpus competitive run — 446 real files across all 36 formats. chunk-engine is a document-understanding engine, so it's measured against its real peers, Docling and Unstructured (text-splitters can't read a file at all).

py-chunks version on PyPIjs-chunks version on npmrs-chunks version on crates.io
Environment2026-07-28
Corpus
446 real files · all 36 formats · 3 runs/file (median)
Machine
Apple M1 Max · 10 cores (8P+2E) · 32 GB
OS
macOS 26.5.1
Runtimes
py-chunks 0.5.0 · docling 2.115.0 · unstructured 0.24.1 · markitdown 0.1.5

Apple-Silicon numbers — compare tools within this run, not across machines. A neutral x86 cloud run is a planned follow-up.

Coverage

Reads more formats than anything else

One representative real fixture per extension, every tool attempted for real — nothing pre-skipped.

chunk-engine35/36
markitdown26/36
unstructured21/36
docling18/36
text-splittersread no files directly0/36

Text-splitters (LangChain, semchunk, Chonkie, semantic-text-splitter) read no files directly — they always chunk markitdown's extracted text.

Structure integrity

Keeps oversized units whole

Feed each tool tables, lists, and code blocks larger than any chunk budget. Only one tool refuses to cut them in half.

ToolTableListCode
chunk-engine · section50%100%100%
chunk-engine · default20%100%100%
chunk-engine · semantic20%100%100%
Docling0%0%0%
Unstructured0%0%0%
LangChain0%0%0%
semchunk · Chonkie · s-t-s0%0%0%

Kept-whole rate: how often an oversized table, list, or code block lands in one chunk instead of being split. Every competitor tested — including Docling and Unstructured — split 100% of them. chunk-engine keeps oversized lists and code whole by design, and its section mode keeps half of oversized tables whole too.

Speed

Milliseconds, not seconds

Native Rust parsing with no ML model loading and no per-element Python overhead. Pooled over all 446 files.

0.51ms
per file
1,980
files / sec
55–221×
faster than peers
chunk-engine1,980files/s
docling35.9files/s
markitdown + langchain35.8files/s
unstructured8.9files/s

Higher is better. Docling and Unstructured also errored on ~half the corpus, so their median is measured over an easier subset — generous to them, not harsh.

Speed by format

Fastest in every category

Per-category multiples are more credible — and more dramatic — than one pooled number.

Categorychunk-engineDoclingUnstructuredmarkitdown+lcFastest by
PDF61.3811,3511,9701,353185× vs Docling
PowerPoint1.17694.431,861436.961,591× vs Unstructured
Word0.44183.11134.0473.89416× vs Docling
Ebook5.39359.941,922118.43357× vs Unstructured
Spreadsheet0.4912.0125.6119.0152× vs Unstructured

Median ms per file (lower is better). chunk-engine is fastest in every category measured — margins widen wherever a competitor's pipeline is heaviest.

Accuracy

Precise typed chunks

Is the content_type label actually right? Ground truth extracted directly from source markup, independent of every tool.

Precisionchunk-engineDoclingUnstructured
table1.000.8541.00
code1.000.4761.00

Perfect precision on tables and code. Docling over-labels code blocks (0.48 precision — many non-code chunks tagged “code”). On headings and lists chunk-engine favours fewer, higher-value typed units — it under-labels at the anchor level but retains ~99% of the content.

Metadata

Richer provenance per chunk

chunk-engine trails on raw page-number population, but attaches a format-specific metadata schema that no competitor exposes.

Page-number populationpage-aware formats

unstructured0.768
docling0.667
chunk-engine0.585

chunk-engine trails on raw page-number population — a fair loss, offset by the schemas on the right.

Per-format metadata schemas

Docling and Unstructured expose only page_number. chunk-engine attaches a schema per extension:

.eml · .msgfrom · to · cc · subject · date · attachments
.epubcreator · identifier · language · spine_count
.ipynbcell / code / markdown counts · kernel
.json · .jsonlrecord_count · envelope_key
.pptxtotal_slides · per-chunk slide_number
.odp · .odt · .rtfcreator · title · author

Prose quality

Doesn't fragment sentences either

The one axis text-splitters compete on. Verified by hand across every mode.

0
genuine sentence splits, any mode
0.983
sliding_window answer-preservation
0.949–0.994
text-splitter range (at parity)

Coverage

Formats × modes

Which chunking modes each format family supports — derived directly from the library source.

Format familydefaultstructuralsectionsemanticsliding_windowsentencepage_awarerowtablesheet
Word (.docx .doc …)
PowerPoint (.pptx .ppt …)
PDF (.pdf)
Web & Markup (.html .md)
Plain text (.txt)
Email (.msg .eml)
OpenDocument (.odt .odp)
eBooks / Notebooks (.epub .ipynb)
JSON (.json .jsonl)
Rich text (.rtf)
Spreadsheets (.xlsx .xls .ods …)
Delimited (.csv .tsv)

Scorecard

The honest tally

Every axis measured — including the ones chunk-engine loses. Credibility comes from the whole picture.

AxisWinnerMargin
Format coveragechunk-engine35/36 vs 18–26; text-splitters 0/36
Structure integrity (oversized units)chunk-engineonly tool that keeps any whole — competitors 0%
Content-type precision (table / code)chunk-engine1.0 / 1.0 vs 0.14–0.85
Content-type recall (heading / list)Doclingchunk-engine retains ~99% of content but under-labels at anchor level
Metadata field richnesschunk-engineonly tool with per-format schemas
Page-number populationUnstructured / Docling0.67–0.77 vs chunk-engine 0.585
Reading ordertieall four ~0.92–0.93 (within measurement noise)
Prose sentence-integritytie0 splits any mode; sliding_window at parity
Speed (pooled, 446 files)chunk-engine55–221× faster; fastest in every category

Full disclosure

What we didn't hide

The same report surfaces every defect it found. Credibility comes from disclosing them, not burying them.

  • 35/36 formats, not 36: XLSB workbooks containing a chart sheet fail to parse (a calamine reader bug).
  • HIGH severity, found by this benchmark: literal “&” is silently dropped from DOCX/PPTX text (“R&D” → “R D”) — a fix is pending, not yet released.
  • Page-number metadata population (0.585) trails Docling/Unstructured (0.67–0.77) on page-aware formats — offset by far richer per-format metadata schemas.
  • On headings/lists chunk-engine under-labels at anchor granularity (but retains ~99% of the content) — it favours higher-value typed units.
  • All numbers are Apple Silicon (M1 Max) and not cross-machine comparable; a neutral x86 cloud run is planned.

Every number here is from a single real run on the environment above — no sampling, no cherry-picking. Absolute figures are Apple-Silicon specific; a neutral x86 cloud run is a planned follow-up.