Performance Benchmarks
Comparing 1ls with jq and fx across various operations and data sizes.
- Runs per test: 5
- Data sizes: 1000, 10000, 100000 records
- Environment: Docker (debian:bookworm-slim)
Summary
| Tool | Avg Time (ms) | vs 1ls |
|---|---|---|
| 1ls | 0.62 | 1x |
| jq | 103.17 | 166x slower |
| fx | 171.61 | 276x slower |
1ls is 166x faster than jq and 276x faster than fx on average.
Lower is better. Times in milliseconds (ms).
Basic Operations (ms)
| Operation | Size | jq | fx | 1ls |
|---|---|---|---|---|
| First element | 1000 | 21.26 | 7.79 | 0.60 |
| Length | 1000 | 21.26 | 6.91 | 0.53 |
| Last element | 1000 | 46.02 | 7.67 | 0.47 |
| First element | 10000 | 32.22 | 41.50 | 0.47 |
| Length | 10000 | 31.58 | 38.55 | 0.47 |
| Last element | 10000 | 31.16 | 39.53 | 0.50 |
| First element | 100000 | 158.56 | 382.21 | 0.64 |
| Length | 100000 | 188.74 | 351.79 | 0.56 |
| Last element | 100000 | 159.04 | 355.60 | 0.52 |
Filter & Map (ms)
| Operation | Size | jq | fx | 1ls |
|---|---|---|---|---|
| Filter | 1000 | 20.73 | 9.49 | 0.47 |
| Map | 1000 | 19.28 | 5.89 | 0.43 |
| Filter+Map | 1000 | 19.78 | 6.28 | 0.54 |
| Filter | 10000 | 47.02 | 65.21 | 0.48 |
| Map | 10000 | 34.35 | 44.06 | 0.53 |
| Filter+Map | 10000 | 37.52 | 44.58 | 0.56 |
| Filter | 100000 | 294.43 | 824.56 | 0.68 |
| Map | 100000 | 208.42 | 395.50 | 0.76 |
| Filter+Map | 100000 | 208.05 | 401.71 | 0.54 |
Aggregation (ms)
| Operation | Size | jq | fx | 1ls |
|---|---|---|---|---|
| Sum | 1000 | 20.90 | 6.21 | 0.59 |
| Min | 1000 | 20.66 | 7.21 | 0.61 |
| Max | 1000 | 20.90 | 7.37 | 0.57 |
| Sum | 10000 | 36.98 | 43.53 | 0.46 |
| Min | 10000 | 35.86 | 44.54 | 0.54 |
| Max | 10000 | 36.44 | 44.45 | 0.71 |
| Sum | 100000 | 227.80 | 397.98 | 0.65 |
| Min | 100000 | 205.29 | 396.93 | 0.50 |
| Max | 100000 | 194.16 | 388.88 | 0.49 |
Builtin Functions (ms)
| Operation | Size | jq | fx | 1ls |
|---|---|---|---|---|
| head() | 1000 | 19.93 | 6.55 | 0.49 |
| last() | 1000 | 19.88 | 5.92 | 0.46 |
| take(10) | 1000 | 19.97 | 5.62 | 0.44 |
| uniq() | 1000 | 20.79 | 8.34 | 0.42 |
| flatten() | 1000 | 21.53 | 9.90 | 0.46 |
| head() | 10000 | 31.34 | 40.23 | 0.48 |
| last() | 10000 | 31.81 | 38.05 | 0.54 |
| take(10) | 10000 | 31.00 | 37.69 | 0.46 |
| uniq() | 10000 | 47.00 | 61.05 | 0.48 |
| flatten() | 10000 | 52.07 | 88.38 | 0.62 |
| head() | 100000 | 171.62 | 353.11 | 0.49 |
| last() | 100000 | 158.29 | 359.10 | 0.59 |
| take(10) | 100000 | 151.69 | 351.13 | 0.49 |
| uniq() | 100000 | 355.20 | 576.73 | 0.53 |
| flatten() | 100000 | 370.08 | 760.43 | 0.51 |
Nested Data Operations (ms)
| Operation | Size | jq | fx | 1ls |
|---|---|---|---|---|
| Deep access | 1000 | 20.33 | 5.20 | 0.65 |
| Recursive descent | 1000 | 24.40 | 10.37 | 0.57 |
| keys() | 1000 | 20.58 | 5.85 | 0.56 |
| Deep access | 10000 | 34.54 | 34.57 | 0.51 |
| Recursive descent | 10000 | 66.25 | 67.84 | 0.53 |
| keys() | 10000 | 34.27 | 79.35 | 0.83 |
| Deep access | 100000 | 179.59 | 312.42 | 0.50 |
| Recursive descent | 100000 | 507.34 | 614.31 | 0.46 |
| keys() | 100000 | 188.50 | 317.64 | 0.46 |
String Operations (ms)
| Operation | Size | jq | fx | 1ls |
|---|---|---|---|---|
| split() | 1000 | 20.49 | 7.99 | 0.47 |
| startswith() | 1000 | 20.33 | 6.47 | 0.48 |
| split() | 10000 | 40.25 | 61.61 | 0.53 |
| startswith() | 10000 | 35.71 | 44.98 | 0.56 |
| split() | 100000 | 238.15 | 523.84 | 0.46 |
| startswith() | 100000 | 188.22 | 383.31 | 0.48 |
Run pnpm run test:bench to regenerate these benchmarks.