JSONata Benchmarks¶
Branchline vs JSONata performance on a curated case matrix.
Latest release results¶
JSONata cross-engine results¶
Source data: CSV.
Scores are throughput in ops/s (higher is faster). Ratios compare Branchline throughput to the fastest JSONata engine. Rows require comparable state and no credibility flag before they count toward speedup summaries.
Dashjoin outliers are excluded from the summary and breakdown (outside 0.01x–100x Dashjoin median).
Branchline speedup summary¶
Counts include cases where both engines have scores, comparable state, and no credibility flag. Speedup is Branchline ops/s divided by Dashjoin ops/s.
| Comparison | Faster cases | Total cases | Avg speedup (faster cases) | Max speedup |
|---|---|---|---|---|
| Interpreter vs Dashjoin | 10 | 10 | 23.659x | 223.862x |
| VM vs Dashjoin | 9 | 10 | 12.803x | 105.44x |
Case breakdown¶
| Case | Branchline Interpreter (ops/s) | Branchline VM (ops/s) | Fastest JSONata (ops/s) | Fastest JSONata engine | Interpreter vs JSONata | VM vs JSONata |
|---|---|---|---|---|---|---|
| api-envelope-shaping | 31943.828 | 29589.864 | 28527.958 | dashjoin | 1.12x | 1.037x |
| contract-drift-projection | 32602.403 | 31710.865 | 20265.989 | dashjoin | 1.609x | 1.565x |
| contract-error-branches | 32846.748 | 32429.179 | 28928.344 | dashjoin | 1.135x | 1.121x |
| large-filter-map-aggregate | 30181.764 | 20117.842 | 20763.614 | dashjoin | 1.454x | 0.969x |
| lookup-join-enrichment | 30685.598 | 26639.593 | 17833.193 | dashjoin | 1.721x | 1.494x |
| nested-mapping-filtering | 28930.097 | 17467.332 | 13947.453 | dashjoin | 2.074x | 1.252x |
| numeric-precision-invoice | 32506.954 | 25991.691 | 25599.068 | dashjoin | 1.27x | 1.015x |
| performance/case001 | 5671.711 | 2671.402 | 25.336 | dashjoin | 223.862x | 105.44x |
| string-object-construction | 32266.286 | 31841.224 | 26979.16 | dashjoin | 1.196x | 1.18x |
| xml-ish-shape | 32782.725 | 31839.119 | 28394.54 | dashjoin | 1.155x | 1.121x |
Row state¶
| Engine | Case | Score (ops/s) | Allocation (B/op) | Validation state | Comparable | Credibility flag | Reason |
|---|---|---|---|---|---|---|---|
| branchline-interpreter | api-envelope-shaping | 31943.828 | 2262.411 | valid | true | ok | n/a |
| branchline-interpreter | contract-drift-projection | 32602.403 | 1967.217 | valid | true | ok | n/a |
| branchline-interpreter | contract-error-branches | 32846.748 | 1153.611 | valid | true | ok | n/a |
| branchline-interpreter | large-filter-map-aggregate | 30181.764 | 5439.332 | valid | true | ok | n/a |
| branchline-interpreter | lookup-join-enrichment | 30685.598 | 2658.412 | valid | true | ok | n/a |
| branchline-interpreter | nested-mapping-filtering | 28930.097 | 5020.014 | valid | true | ok | n/a |
| branchline-interpreter | numeric-precision-invoice | 32506.954 | 2341.611 | valid | true | ok | n/a |
| branchline-interpreter | performance/case001 | 5671.711 | 191672.874 | valid | true | ok | n/a |
| branchline-interpreter | string-object-construction | 32266.286 | 1664.81 | valid | true | ok | n/a |
| branchline-interpreter | xml-ish-shape | 32782.725 | 2089.611 | valid | true | ok | n/a |
| branchline-vm | api-envelope-shaping | 29589.864 | 1278.791 | valid | true | ok | n/a |
| branchline-vm | contract-drift-projection | 31710.865 | 2348.812 | valid | true | ok | n/a |
| branchline-vm | contract-error-branches | 32429.179 | 1266.071 | valid | true | ok | n/a |
| branchline-vm | large-filter-map-aggregate | 20117.842 | 11068.021 | valid | true | ok | n/a |
| branchline-vm | lookup-join-enrichment | 26639.593 | 320.051 | valid | true | ok | n/a |
| branchline-vm | nested-mapping-filtering | 17467.332 | 5740.024 | valid | true | ok | n/a |
| branchline-vm | numeric-precision-invoice | 25991.691 | 5084.816 | valid | true | ok | n/a |
| branchline-vm | performance/case001 | 2671.402 | 294402.557 | valid | true | ok | n/a |
| branchline-vm | string-object-construction | 31841.224 | 1823.211 | valid | true | ok | n/a |
| branchline-vm | xml-ish-shape | 31839.119 | 2348.812 | valid | true | ok | n/a |
| dashjoin | api-envelope-shaping | 28527.958 | 8404.018 | valid | true | ok | n/a |
| dashjoin | contract-drift-projection | 20265.989 | 30328.021 | valid | true | ok | n/a |
| dashjoin | contract-error-branches | 28928.344 | 5726.383 | valid | true | ok | n/a |
| dashjoin | large-filter-map-aggregate | 20763.614 | 23984.821 | valid | true | ok | n/a |
| dashjoin | lookup-join-enrichment | 17833.193 | 43201.624 | valid | true | ok | n/a |
| dashjoin | nested-mapping-filtering | 13947.453 | 67782.43 | valid | true | ok | n/a |
| dashjoin | numeric-precision-invoice | 25599.068 | 13952.236 | valid | true | ok | n/a |
| dashjoin | performance/case001 | 25.336 | 4.3753968708E7 | valid | true | ok | n/a |
| dashjoin | string-object-construction | 26979.16 | 14912.815 | valid | true | ok | n/a |
| dashjoin | xml-ish-shape | 28394.54 | 9851.214 | valid | true | ok | n/a |
| ibm | api-envelope-shaping | 22631.24 | 14220.341 | valid | true | ok | n/a |
| ibm | contract-drift-projection | 14890.234 | 42834.429 | valid | true | ok | n/a |
| ibm | contract-error-branches | 26520.269 | 8032.031 | valid | true | ok | n/a |
| ibm | large-filter-map-aggregate | 1.587020146E8 | 0.0 | evaluation_error | false | implausible_high_score_near_zero_alloc | java.lang.reflect.InvocationTargetException |
| ibm | lookup-join-enrichment | 2.45759183738E8 | 0.0 | evaluation_error | false | implausible_high_score_near_zero_alloc | java.lang.reflect.InvocationTargetException |
| ibm | nested-mapping-filtering | 6403.557 | 202559.333 | valid | true | ok | n/a |
| ibm | numeric-precision-invoice | 22360.675 | 12544.019 | valid | true | ok | n/a |
| ibm | performance/case001 | 2.46022063338E8 | 0.0 | compile_error | false | implausible_high_score_near_zero_alloc | line 1:15 at null: token recognition error at: '#' , line 1:16 at [@4,16:17='$i',<47>,1:16]: mismatched input '$i' expecting {'.', ',', 'in', '?', '[', '{', '}', '~>', '*', '/', '+', '-', '%', '=', '!=', '<', '<=', '>', '>=', '&', '^', 'and', 'or'} |
| ibm | string-object-construction | 26921.242 | 9131.223 | valid | true | ok | n/a |
| ibm | xml-ish-shape | 19789.458 | 27059.222 | valid | true | ok | n/a |
Release history¶
- perf-ce58599 (prerelease)
- perf-7285ce0 (prerelease)
- snapshot-e206245 (prerelease)
- snapshot-c502022 (prerelease)
Full archive: Release benchmark history.
Scope¶
- Default suite: case matrix in
jsonata-benchmarks/src/jmh/resources/jsonata-case-matrix.yaml. - Full JSONata test-suite runs are opt-in via
-PjsonataFullSuite=trueor a custom-PjmhIncludes=.... - Cross-engine rows are meaningful only when Branchline interpreter, Branchline VM, Kotlin baseline, and any configured JSONata engines perform semantically equivalent JSON transformations.
Methodology¶
JSONata benchmark pages cover execution throughput for JSON-like transformations. They do not include Branchline-only XML, inspect, contract, or conversion-loss measurements unless the page labels them separately.
| Result type | Included engines | Requirement before comparison |
|---|---|---|
| Cross-engine JSON execution | Branchline interpreter, Branchline VM, Kotlin baseline, Dashjoin JSONata, IBM JSONata. | Transformation intent is equivalent and semantic validation records a pass or expected non-equivalence. |
| Parse or compile cost | JSONata expression compilation, Branchline program compilation, or Kotlin setup measured separately. | Do not combine with execution throughput. |
| Unavailable or expected-failure rows | Missing external jars, unsupported functions, timeouts, and expected JSONata failures. | Show the reason instead of treating the row as zero throughput. |
Representative case categories¶
| Category | Planned case IDs | Product framing |
|---|---|---|
| ETL and API mediation | etl-order-normalization, api-envelope-shaping |
Common service-boundary JSON reshaping with defaults and nested output. |
| Nested mapping/filtering | nested-mapping-filtering, large-filter-map-aggregate |
Repeated filtering and nested output construction over product-like arrays. |
| Joins/lookups | lookup-join-enrichment, jsonata-migration-pack-01 |
Enrich records from object-key lookup tables. |
| String/object construction | string-object-construction, jsonata-migration-pack-02, jsonata-migration-pack-04, jsonata-migration-pack-05 |
String cleanup, labels, slugs, CSV-like joins, and object-shaped public output. |
| XML-ish JSON shape | xml-ish-shape |
Attribute/text-key JSON that mirrors XML mapping without using Branchline-only XML runtime features. |
| Contract/error branches | contract-error-branches, contract-drift-projection |
Stable output under optional fields, status branches, and error payloads. |
| Numeric safety | numeric-precision-invoice |
Currency totals, discounts, and large identifiers with documented numeric equivalence. |
| Migration examples | jsonata-migration-pack-01..05 |
Clear JSONata expressions with Branchline analogs and Kotlin evaluators. |
The matrix still includes micro and JSONata-suite shaped rows. A missing external Dashjoin or IBM jar must be reported as unavailable, expected failures must remain visible, and semantic validation must be recorded before publishing speed claims for a case.
string-concat/case000 is retained as a JSONata-suite scalar baseline and is not used for Branchline speedup claims. Use string-object-construction for the comparable object-output string construction baseline.
Run locally¶
DASHJOIN_REPO=path/to/dashjoin-jars \
IBM_JSONATA_REPO=path/to/ibm-jars \
./gradlew :jsonata-benchmarks:jmh
Representative long profile:
DASHJOIN_REPO=path/to/dashjoin-jars \
IBM_JSONATA_REPO=path/to/ibm-jars \
./gradlew :jsonata-benchmarks:jmh -PjmhProfile=representative-long
Override the selected cases or run length with -PjmhCaseIds=..., -PjmhWarmupIterations=..., -PjmhIterations=..., -PjmhTimeOnIteration=..., and -PjmhForks=....
Raw artifacts¶
Latest assets live on the latest GitHub release.
Asset names:
branchline-jsonata-summary-<tag>.mdbranchline-jsonata-summary-<tag>.csvbranchline-jsonata-jmh-<tag>.json