Benchmarks
Generated: 2026-02-09 Node: v20.20.0
Summary
- Each query is time-boxed per dataset (see targetMs in results.json).
- Eval is disabled unless required by a query.
- Suite includes RFC 9535 filter functions (length/match) and reverse slices.
- Datasets cover small fixtures, synthetic collections, deep trees, wide objects, large arrays, and Unicode-heavy keys.
- Datasets: 7 (fixture, synthetic, nested, wide, array, unicode, cars).
- Queries: 43 total (9 eval, 34 non-eval).
- Tags: recursion, filters, rfc-functions, reverse-slice, unicode.
- Cars dataset is loaded from bench/cars.json (~100MB).
- Some queries are unsupported by certain engines and marked as such.
Results
Fixture (Goessner)
| Query | Path | Eval | JsonPathX ops/sec | JSONPath Plus ops/sec | jsonpath ops/sec | Winner |
|---|
| root | $ | false | 8,046,527 | 2,345,368 | 717,073 | jsonpathx |
| dot | $.store.book[0].author | false | 4,926,395 | 904,831 | 57,109 | jsonpathx |
| bracket | $['store']['book'][0]['author'] | false | 4,970,136 | 837,962 | 43,979 | jsonpathx |
| union-names | $.store['book','bicycle'] | false | 703,095 | 606,648 | 62,627 | jsonpathx |
| wildcard | $.store.* | false | 745,957 | 1,113,069 | 108,413 | jsonpath-plus |
| recursive | $..author | false | 806,756 | 256,003 | 79,191 | jsonpathx |
| slice | $.store.book[0:2] | false | 574,346 | 535,521 | 65,125 | jsonpathx |
| slice-negative | $.store.book[-3:-1] | false | 570,608 | 509,291 | 65,355 | jsonpathx |
| index-negative | $.store.book[-1] | false | 5,256,257 | 1,350,351 | 74,531 | jsonpathx |
| union | $.store.book[0,2] | false | 544,833 | 535,831 | 55,420 | tie (jsonpathx) |
| filter | $..book[?(@.price < 10)] | native | 497,775 | 2,689 | 45,892 | jsonpathx |
| script | $..book[(@.length-1)] | native | 472,701 | 2,774 | 23,510 | jsonpathx |
| parent | $..book[?(@.price > 10)]^ | native | 348,668 | 2,899 | unsupported | jsonpathx |
| property | $.store.*~ | false | 448,804 | 864,325 | unsupported | jsonpath-plus |
| type-selector | $..*@number() | false | 480,683 | 105,606 | unsupported | jsonpathx |
| rfc-length | $..book[?length(@.author) > 3] | false | 231,694 | 305,991 | unsupported | jsonpath-plus |
| rfc-match | $..book[?match(@.author, '^[A-Z]')] | false | 286,975 | 305,547 | unsupported | jsonpath-plus |
Synthetic (2k items)
| Query | Path | Eval | JsonPathX ops/sec | JSONPath Plus ops/sec | jsonpath ops/sec | Winner |
|---|
| root | $ | false | 6,863,361 | 1,988,711 | 691,039 | jsonpathx |
| synthetic-items | $.items[*].id | false | 1,477 | 1,748 | 287 | jsonpath-plus |
| synthetic-filter | $.items[?(@.price > 750 && @.tags.featured)].id | native | 27,421 | 295 | 2,228 | jsonpathx |
| synthetic-filter-heavy | $.items[?(@.price > 500 && @.specs.weight < 20)].id | native | 6,423 | 268 | 1,231 | jsonpathx |
| synthetic-recursive | $..tags.featured | false | 609 | 268 | 83 | jsonpathx |
| synthetic-groups | $.groups[*].items[*].id | false | 1,502 | 1,614 | 282 | jsonpath-plus |
| synthetic-slice | $.items[100:500:5].price | false | 844,128 | 24,268 | 2,182 | jsonpathx |
| synthetic-slice-reverse | $.items[200:0:-3].price | false | 934,160 | 1,366,915 | 2,254 | jsonpath-plus |
Nested (tree)
| Query | Path | Eval | JsonPathX ops/sec | JSONPath Plus ops/sec | jsonpath ops/sec | Winner |
|---|
| root | $ | false | 6,615,926 | 2,049,127 | 694,671 | jsonpathx |
| nested-recursive | $.tree..leaf | false | 45,585 | 8,113 | 4,353 | jsonpathx |
| nested-siblings | $.tree.siblings[*].leaf | false | 436,588 | 725,431 | 58,506 | jsonpath-plus |
| nested-filter | $..[?(@.leaf == true)] | native | 12,493 | 683 | 3,045 | jsonpathx |
Wide (2k keys)
| Query | Path | Eval | JsonPathX ops/sec | JSONPath Plus ops/sec | jsonpath ops/sec | Winner |
|---|
| root | $ | false | 6,715,609 | 2,046,392 | 680,597 | jsonpathx |
| wide-specific | $.props.key_1999.value | false | 4,689,267 | 960,650 | 79,980 | jsonpathx |
| wide-wildcard | $.props.*.value | false | 1,184 | 1,393 | 267 | jsonpath-plus |
| wide-filter | $.props.*[?(@.nested.flag)].value | native | unsupported | unsupported | 3 | jsonpath |
| wide-recursive | $..value | false | 1,307 | 380 | 204 | jsonpathx |
Array (50k items)
| Query | Path | Eval | JsonPathX ops/sec | JSONPath Plus ops/sec | jsonpath ops/sec | Winner |
|---|
| root | $ | false | 6,745,575 | 2,075,778 | 649,101 | jsonpathx |
| array-slice-large | $.data[1000:5000:7] | false | 14,541 | 6,411 | 61 | jsonpathx |
| array-union | $.data[0,100,1000,10000] | false | 541,916 | 352,507 | 152 | jsonpathx |
| array-last | $.data[-1] | false | 6,032,133 | 1,626,719 | 614 | jsonpathx |
Unicode (quoted names)
| Query | Path | Eval | JsonPathX ops/sec | JSONPath Plus ops/sec | jsonpath ops/sec | Winner |
|---|
| root | $ | false | 6,862,365 | 2,127,418 | 697,996 | jsonpathx |
| unicode-quoted | $['naïve key']['emoji😀'][*]['sp ace'] | false | 409,279 | 675,471 | 41,442 | jsonpath-plus |
| unicode-recursive | $..['sp ace'] | false | 1,552,253 | 460,134 | 104,240 | jsonpathx |
Cars (100MB)
| Query | Path | Eval | JsonPathX ops/sec | JSONPath Plus ops/sec | jsonpath ops/sec | Winner |
|---|
| root | $ | false | 6,945,844 | 2,130,874 | 711,466 | jsonpathx |
| cars-brand | $.cars[*].brand.name | false | 48 | 44 | 0 | jsonpathx |
| cars-models | $.cars[:25].model | false | 987,413 | 70,610 | 142 | jsonpathx |
| cars-union | $.cars[0,1,2].manufacturer | false | 359,668 | 340,728 | 649 | jsonpathx |
| cars-recursive | $..engineDisplacement | false | 13 | 12 | 2 | jsonpathx |
| cars-filter | $.cars[?(@.fuelType == 'Petrol')].model | native | 68 | 16 | 1 | jsonpathx |
| cars-script | $.cars[(@.length-1)].model | native | 466,121 | 2,895 | 1,064 | jsonpathx |
| cars-property | $.cars[0].extraFeatures.*~ | false | 212,064 | 379,385 | unsupported | jsonpath-plus |