Performance benchmarks, measurements, and comparative analysis.
Measured comparisons between the Rust-backed language bindings and the legacy implementations they replace, plus a binding-overhead atlas against the pure Rust core. All arms run one normative protocol over one committed workload and must pass a correctness gate against a Rust oracle before any timing is accepted.
Every measurement taken, with an explicit accounting of what was not measured and which figures are provisional. Start here.
Strategy, procedure, integrity constraints, and how each is validated — including the procedure for re-measuring after a code change. Read before running or extending the program.
Legacy liblevenshtein-java 3.0.0 against the Java 22 FFM binding, calibrated
against a third implementation so the result is not misread.
Legacy liblevenshtein-cpp against the Rust-backed C++ facade, with the
core / ABI / facade cost decomposition.
The normative harness contract (CLI surface, timed loop, checksum bit-layout,
per-language clocks, fairness rules) lives separately in
benchmarks/cross-language/harnesses/common/PROTOCOL.md.
The dictionary producer's collection traversal and binding protocol isolates owned Rust iteration, an allocation-reusing visitor, complete host materialization, bounded ABI batches, and early cancellation. The same-binary paired runner and deterministic analyzer live here because they reuse this repository's topology-aware admission and statistical contract:
run-collection-traversal-experiment.shprepare-collection-traversal-resume.pyanalyze-collection-traversal.pycollection-traversal-sample.schema.jsonhost-collection-traversal-sample.schema.jsonPer-language package drivers emit the same checksum/work schema but time only their native collection view or closeable stream. Startup, construction, JIT warmup, and profiler instrumentation remain outside the admitted interval.
Comprehensive comparison of the dictionary backends:
DynamicDawg — the current directed-acyclic-word-graph backend)Historical note. Earlier revisions of the linked report also benchmarked the classic static
DawgDictionaryand the arena-optimizedOptimizedDawg. Both were removed in the 0.9.x line (backends extracted tolibdictenstein); their roles are now covered byDynamicDawgandDoubleArrayTrie. Any such rows in the report are retained only as a historical baseline.
Final comprehensive backend benchmark results:
Detailed benchmark data and analysis:
Results from Double Array Trie optimization work:
In-depth performance analysis of Double Array Trie:
Comprehensive analysis of DAT implementation:
The end-to-end hypothesis, correctness, host-admission, statistical, headless-profiler, visualization, acceptance, and propagation contract for the Java-parity optimization campaign.
Profile- and work-counter-backed explanation of the construction, native
matching, and resource-boundary gaps against liblevenshtein-java, plus the
ranked hypotheses that gate the optimization campaign.
Backend-by-backend and query-surface-by-query-surface classification of every accepted parity optimization, including the generic invariant, specialized adaptations, explicit inapplicability reasons, and completion gates.
Repeatable commands for the UCR/UEA MSM archive benchmark and the CMUdict phonetic homophone benchmark:
systemd-runAnalysis of DAWG optimization techniques:
Overall optimization results across all components:
High-level summary of optimization work:
General performance analysis and profiling results:
The following files contain raw benchmark output:
backend_comparison_6backends.txt - 6-backend comparison raw databackend_comparison_optimized.txt - Optimized backend comparisonbackend_comparison_results.txt - Detailed backend comparison resultsdat_benchmark_results.txt - DAT benchmark outputdat_fuzzy_matching_results.txt - DAT fuzzy matching benchmarksdat_levenshtein_benchmark.txt - DAT Levenshtein distance benchmarksdat_optimized_benchmark.txt - Optimized DAT benchmark resultsAll benchmarks are run using Criterion.rs with:
Can you improve this documentation?Edit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |