Benchmarks¶
Performance results for the Branchline interpreter and VM.
Latest release¶
Runtime and allocation (mean, p95)¶
Source data: CSV.
| Runtime | Dataset | Mean (us/op) | p95 (us/op) | Alloc (B/op) | Params |
|---|---|---|---|---|---|
| Interpreter pathExpressions | Small | 0.483 | 0.461 | 784.215 | collectionType=hash |
| Interpreter pathExpressions | Small | 0.571 | 0.512 | 784.247 | collectionType=persistent |
| Interpreter pathExpressions | Medium | 0.523 | 0.491 | 784.216 | collectionType=hash |
| Interpreter pathExpressions | Medium | 0.546 | 0.521 | 784.245 | collectionType=persistent |
| Interpreter pathExpressions | Large | 0.503 | 0.491 | 784.199 | collectionType=hash |
| Interpreter pathExpressions | Large | 0.531 | 0.530 | 784.219 | collectionType=persistent |
| Interpreter arrayComprehensions | Small | 1.208 | 1.132 | 1376.501 | collectionType=hash |
| Interpreter arrayComprehensions | Small | 1.164 | 1.112 | 1376.494 | collectionType=persistent |
| Interpreter arrayComprehensions | Medium | 6.854 | 7.182 | 5114.281 | collectionType=hash |
| Interpreter arrayComprehensions | Medium | 7.167 | 7.368 | 5170.192 | collectionType=persistent |
| Interpreter arrayComprehensions | Large | 39.359 | 49.856 | 32776.972 | collectionType=hash |
| Interpreter arrayComprehensions | Large | 43.578 | 54.464 | 32833.489 | collectionType=persistent |
| Interpreter typicalTransform | Small | 1.334 | 1.282 | 848.453 | collectionType=hash |
| Interpreter typicalTransform | Small | 1.457 | 1.392 | 824.501 | collectionType=persistent |
| Interpreter typicalTransform | Medium | 10.816 | 10.720 | 2322.185 | collectionType=hash |
| Interpreter typicalTransform | Medium | 11.197 | 11.088 | 2370.793 | collectionType=persistent |
| Interpreter typicalTransform | Large | 53.675 | 63.040 | 8746.021 | collectionType=hash |
| Interpreter typicalTransform | Large | 55.447 | 64.960 | 8802.413 | collectionType=persistent |
| Interpreter deepNestedRead | Small | 9.269 | 9.152 | 2665.923 | collectionType=hash |
| Interpreter deepNestedRead | Small | 9.069 | 9.042 | 2682.221 | collectionType=persistent |
| Interpreter deepNestedSet | Small | 12.168 | 13.104 | 15635.672 | collectionType=hash |
| Interpreter deepNestedSet | Small | 11.887 | 12.080 | 14667.436 | collectionType=persistent |
| Interpreter nestedPathSetInLoop | Small | 2.420 | 2.352 | 4240.803 | collectionType=hash |
| Interpreter nestedPathSetInLoop | Small | 2.601 | 2.484 | 4480.860 | collectionType=persistent |
| Interpreter nestedPlusAssign | Small | 2.247 | 2.132 | 3200.921 | collectionType=hash |
| Interpreter nestedPlusAssign | Small | 2.329 | 2.232 | 3200.910 | collectionType=persistent |
| Interpreter stdlibCascadeAppend | Small | 1.736 | 1.692 | 4368.649 | collectionType=hash |
| Interpreter stdlibCascadeAppend | Small | 2.059 | 1.944 | 4368.796 | collectionType=persistent |
| Interpreter deepNestedRead | Medium | 182.155 | 193.280 | 38087.847 | collectionType=hash |
| Interpreter deepNestedRead | Medium | 178.057 | 191.232 | 40577.373 | collectionType=persistent |
| Interpreter deepNestedSet | Medium | 228.287 | 244.480 | 272693.282 | collectionType=hash |
| Interpreter deepNestedSet | Medium | 231.112 | 243.136 | 275179.276 | collectionType=persistent |
| Interpreter nestedPathSetInLoop | Medium | 22.532 | 24.032 | 41478.981 | collectionType=hash |
| Interpreter nestedPathSetInLoop | Medium | 23.735 | 25.376 | 43935.609 | collectionType=persistent |
| Interpreter nestedPlusAssign | Medium | 19.404 | 20.608 | 38892.923 | collectionType=hash |
| Interpreter nestedPlusAssign | Medium | 19.764 | 20.864 | 38989.209 | collectionType=persistent |
| Interpreter stdlibCascadeAppend | Medium | 14.795 | 15.744 | 46076.122 | collectionType=hash |
| Interpreter stdlibCascadeAppend | Medium | 14.889 | 15.808 | 46052.503 | collectionType=persistent |
| Interpreter deepNestedRead | Large | 2251.729 | 2289.664 | 440685.226 | collectionType=hash |
| Interpreter deepNestedRead | Large | 2326.345 | 2400.256 | 452727.240 | collectionType=persistent |
| Interpreter deepNestedSet | Large | 2592.467 | 2648.678 | 3640846.138 | collectionType=hash |
| Interpreter deepNestedSet | Large | 2526.443 | 2578.022 | 3352928.793 | collectionType=persistent |
| Interpreter nestedPathSetInLoop | Large | 115.437 | 124.288 | 204716.771 | collectionType=hash |
| Interpreter nestedPathSetInLoop | Large | 124.110 | 133.888 | 216776.171 | collectionType=persistent |
| Interpreter nestedPlusAssign | Large | 95.046 | 104.576 | 200656.079 | collectionType=hash |
| Interpreter nestedPlusAssign | Large | 107.789 | 117.248 | 200737.816 | collectionType=persistent |
| Interpreter stdlibCascadeAppend | Large | 80.099 | 88.960 | 242584.604 | collectionType=hash |
| Interpreter stdlibCascadeAppend | Large | 79.098 | 88.064 | 242585.160 | collectionType=persistent |
| VM pathExpressions | Small | 1.042 | 0.982 | 704.448 | n/a |
| VM pathExpressions | Medium | 1.044 | 0.982 | 704.437 | n/a |
| VM pathExpressions | Large | 1.053 | 1.002 | 704.433 | n/a |
| VM arrayComprehensions | Small | 2.561 | 2.472 | 800.730 | n/a |
| VM arrayComprehensions | Medium | 14.435 | 14.416 | 803.594 | n/a |
| VM arrayComprehensions | Large | 94.766 | 104.576 | 5669.857 | n/a |
| VM typicalTransform | Small | 7.083 | 6.872 | 1065.880 | n/a |
| VM typicalTransform | Medium | 59.049 | 67.072 | 4676.051 | n/a |
| VM typicalTransform | Large | 305.319 | 321.536 | 20721.367 | n/a |
| VM canonicalMutationStyleLegacySelfAppendVm | Small | 2.986 | 3.124 | 2241.013 | n/a |
| VM canonicalMutationStylePlusAssignVm | Small | 2.993 | 2.792 | 1688.908 | n/a |
| VM xmlToJsonOrderVm | Small | 33.675 | 49.472 | 51818.792 | n/a |
| VM canonicalMutationStyleLegacySelfAppendVm | Medium | 25.484 | 27.744 | 25927.565 | n/a |
| VM canonicalMutationStylePlusAssignVm | Medium | 26.937 | 29.728 | 46695.393 | n/a |
| VM xmlToJsonOrderVm | Medium | 34.191 | 49.152 | 51818.896 | n/a |
| VM canonicalMutationStyleLegacySelfAppendVm | Large | 168.689 | 180.480 | 136499.536 | n/a |
| VM canonicalMutationStylePlusAssignVm | Large | 178.479 | 191.488 | 1030747.775 | n/a |
| VM xmlToJsonOrderVm | Large | 35.921 | 53.376 | 51819.904 | n/a |
| Other canonicalMutationStyleLegacySelfAppend | Small | 1.680 | 2.204 | 1768.637 | n/a |
| Other canonicalMutationStylePlusAssign | Small | 1.164 | 1.082 | 1264.499 | n/a |
| Other contractInferAndDiff | Small | 103.823 | 119.552 | 287370.776 | n/a |
| Other conversionLossAudit | Small | 27.397 | 39.040 | 43520.262 | n/a |
| Other inspectNormalizeLoop | Small | 67.967 | 84.736 | 129357.913 | n/a |
| Other xmlToJsonOrder | Small | 33.778 | 50.432 | 52850.521 | n/a |
| Other canonicalMutationStyleLegacySelfAppend | Medium | 12.798 | 13.568 | 21164.296 | n/a |
| Other canonicalMutationStylePlusAssign | Medium | 9.382 | 9.664 | 16338.842 | n/a |
| Other contractInferAndDiff | Medium | 106.501 | 124.160 | 287903.258 | n/a |
| Other conversionLossAudit | Medium | 28.580 | 44.736 | 44481.982 | n/a |
| Other inspectNormalizeLoop | Medium | 65.785 | 79.744 | 127314.812 | n/a |
| Other xmlToJsonOrder | Medium | 33.421 | 47.808 | 52883.819 | n/a |
| Other canonicalMutationStyleLegacySelfAppend | Large | 62.418 | 71.680 | 112523.158 | n/a |
| Other canonicalMutationStylePlusAssign | Large | 46.266 | 55.424 | 88514.924 | n/a |
| Other contractInferAndDiff | Large | 102.831 | 117.888 | 287363.754 | n/a |
| Other conversionLossAudit | Large | 28.202 | 38.464 | 44481.521 | n/a |
| Other inspectNormalizeLoop | Large | 69.578 | 89.472 | 127149.840 | n/a |
| Other xmlToJsonOrder | Large | 33.713 | 48.064 | 52851.104 | n/a |
Interpreter vs VM ratio (mean)¶
| Benchmark | Dataset | Interpreter (us/op) | VM (us/op) | Ratio (VM/Interp) |
|---|---|---|---|---|
| pathExpressions | Small | 0.571 | 1.042 | 1.824x |
| pathExpressions | Medium | 0.546 | 1.044 | 1.911x |
| pathExpressions | Large | 0.531 | 1.053 | 1.982x |
| arrayComprehensions | Small | 1.164 | 2.561 | 2.201x |
| arrayComprehensions | Medium | 7.167 | 14.435 | 2.014x |
| arrayComprehensions | Large | 43.578 | 94.766 | 2.175x |
| typicalTransform | Small | 1.457 | 7.083 | 4.860x |
| typicalTransform | Medium | 11.197 | 59.049 | 5.274x |
| typicalTransform | Large | 55.447 | 305.319 | 5.506x |
Release history¶
- perf-ce58599 (prerelease)
- perf-7285ce0 (prerelease)
- snapshot-e206245 (prerelease)
- snapshot-c502022 (prerelease)
- v0.10.0 (prerelease)
Full archive: Release benchmark history.
Methodology¶
Benchmark results are split by measurement type so the public pages do not collapse different costs into one speed claim.
| Measurement | What it means | Comparison rule |
|---|---|---|
| Cross-engine JSON execution | JSON-like transformations that can run through Branchline, a Kotlin baseline, and configured JSONata engines. | Compare only rows with equivalent transformation intent and a recorded validation state. |
| Interpreter vs VM execution | Branchline interpreter and VM throughput over the same JMH datasets. | Use the same machine, JDK, inputs, and release artifacts; watch for VM fallback or overhead notes. |
| Branchline-specific measurements | XML conversion, contract inference or diff, inspect/normalize, conversion-loss audit, and canonical mutation style. | Treat as Branchline product-surface measurements unless a fair external-engine analog exists. |
| Publication health | Release summary Markdown, generated HTML pages, and CSV assets. | Verify links point to generated HTML directories and CSV assets sit next to each release page. |
Public benchmark rows should identify the case id, workload category, whether the case is product-representative, engine, score, error margin, allocation when available, expected-failure or unavailable reason, validation state, and notes.
What we measure¶
| Area | Interpreter benchmark | VM benchmark |
|---|---|---|
| Path expressions | InterpreterTransformBenchmark.pathExpressions |
VMTransformBenchmark.pathExpressions |
| Array comprehensions | InterpreterTransformBenchmark.arrayComprehensions |
VMTransformBenchmark.arrayComprehensions |
| Typical transform | InterpreterTransformBenchmark.typicalTransform |
VMTransformBenchmark.typicalTransform |
Datasets: Small (10x5), Medium (100x10), Large (500x25).
Representative case categories¶
| Category | Status | Public framing |
|---|---|---|
| ETL and API normalization | Planned Tier 1 cross-engine cases such as etl-order-normalization and api-envelope-shaping. |
Representative JSON execution comparison after semantic validation is available. |
| Large filter/map/aggregate | Planned Tier 1 cross-engine case large-filter-map-aggregate. |
Collection throughput comparison, separate from parse or compile cost. |
| Contract drift and governance | Planned Tier 1 JSON case contract-drift-projection; Tier 2 contract inference/diff work remains Branchline-specific. |
Execution can be compared only for equivalent JSON projection; contract analysis is a Branchline-specific measurement. |
| Numeric precision invoice handling | Planned Tier 1 cross-engine case numeric-precision-invoice. |
Requires notes for numeric equivalence and large-id handling before speed claims. |
| XML, inspect, and conversion audit | Planned Tier 2 Branchline-specific cases. | Product-surface measurements, not JSONata speed comparisons by default. |
Current release summaries may still contain micro or suite-shaped cases. Treat them as coverage and plumbing evidence until representative cases and semantic validation are present.
Run locally¶
Notes¶
- Compare runs on the same machine and JDK.
- Report deltas against the previous release.
- Missing suites, unavailable engines, expected failures, semantic mismatches, and VM fallback must be visible in the release notes or generated tables.