Optimized SIMD routines for escaping JSON strings. The implementation is from sonic-rs, we only take the string escaping part to avoid the abstraction overhead.
Numbers below come from cargo bench
runs on GitHub Actions hardware. Criterion reports are summarized to make it easier to spot relative performance. "vs fastest" shows how much slower each implementation is compared to the fastest entry in the table (1.00× means fastest).
AVX2
enabled.
Short string payload (~89M iterations)
Implementation | Median time | vs fastest |
---|---|---|
escape simd |
56.23 ns | 1.00× |
escape generic |
111.58 ns | 1.98× |
serde_json |
111.65 ns | 1.99× |
json-escape |
140.01 ns | 2.49× |
escape v_jsonescape |
151.98 ns | 2.70× |
escape sonic |
202.21 ns | 3.60× |
RxJS payload (~10k iterations)
Implementation | Median time | vs fastest |
---|---|---|
escape simd |
246.84 µs | 1.00× |
escape sonic |
261.87 µs | 1.06× |
escape v_jsonescape |
531.77 µs | 2.15× |
json-escape |
561.93 µs | 2.28× |
escape generic |
664.00 µs | 2.69× |
serde_json |
649.19 µs | 2.63× |
Fixtures payload (~300 iterations)
Implementation | Median time | vs fastest |
---|---|---|
escape simd |
9.1461 ms | 1.00× |
escape sonic |
9.3410 ms | 1.02× |
json-escape |
19.077 ms | 2.09× |
escape v_jsonescape |
20.015 ms | 2.19× |
serde_json |
21.240 ms | 2.32× |
escape generic |
22.512 ms | 2.46× |
Neon enabled.
Short string payload (~76M iterations)
Implementation | Median time | vs fastest |
---|---|---|
escape simd |
65.42 ns | 1.00× |
escape generic |
108.28 ns | 1.66× |
serde_json |
110.73 ns | 1.69× |
json-escape |
150.64 ns | 2.30× |
escape v_jsonescape |
183.41 ns | 2.80× |
escape sonic |
212.87 ns | 3.25× |
RxJS payload (~10k iterations)
Implementation | Median time | vs fastest |
---|---|---|
escape simd |
283.40 µs | 1.00× |
escape sonic |
305.34 µs | 1.08× |
json-escape |
468.04 µs | 1.65× |
escape generic |
548.50 µs | 1.94× |
serde_json |
567.23 µs | 2.00× |
escape v_jsonescape |
758.18 µs | 2.68× |
Fixtures payload (~300 iterations)
Implementation | Median time | vs fastest |
---|---|---|
escape simd |
10.46 ms | 1.00× |
escape sonic |
11.18 ms | 1.07× |
json-escape |
15.45 ms | 1.48× |
escape generic |
17.75 ms | 1.70× |
serde_json |
18.01 ms | 1.72× |
escape v_jsonescape |
24.93 ms | 2.38× |
Apple M1 chip
Short string payload (~45M iterations)
Implementation | Median time | vs fastest |
---|---|---|
escape simd |
113.16 ns | 1.00× |
serde_json |
128.52 ns | 1.14× |
escape generic |
136.06 ns | 1.20× |
json-escape |
173.16 ns | 1.53× |
escape v_jsonescape |
198.80 ns | 1.76× |
escape sonic |
226.21 ns | 2.00× |
RxJS payload (~10k iterations)
Implementation | Median time | vs fastest |
---|---|---|
escape sonic |
379.94 µs | 1.00× |
escape simd |
395.41 µs | 1.04× |
json-escape |
618.74 µs | 1.63× |
escape generic |
690.86 µs | 1.82× |
serde_json |
720.05 µs | 1.89× |
escape v_jsonescape |
839.86 µs | 2.21× |
AFFiNE sources payload (~300 iterations)
Implementation | Median time | vs fastest |
---|---|---|
escape simd |
12.60 ms | 1.00× |
escape sonic |
14.04 ms | 1.11× |
json-escape |
21.54 ms | 1.71× |
serde_json |
23.33 ms | 1.85× |
escape generic |
24.55 ms | 1.95× |
escape v_jsonescape |
26.82 ms | 2.13× |
Short string benchmark
Implementation | Median time | vs fastest |
---|---|---|
escape simd |
90.58 ns | 1.00× |
serde_json |
139.23 ns | 1.54× |
escape generic |
146.15 ns | 1.61× |
json-escape |
173.60 ns | 1.92× |
escape v_jsonescape |
198.60 ns | 2.19× |
escape sonic |
199.27 ns | 2.20× |
RxJS payload (~10k iterations)
Implementation | Median time | vs fastest |
---|---|---|
escape simd |
196.07 µs | 1.00× |
escape sonic |
196.32 µs | 1.00× |
json-escape |
446.94 µs | 2.28× |
escape generic |
488.37 µs | 2.49× |
serde_json |
553.08 µs | 2.82× |
escape v_jsonescape |
618.31 µs | 3.15× |
AFFiNE sources payload (~300 iterations)
Implementation | Median time | vs fastest |
---|---|---|
escape simd |
10.36 ms | 1.00× |
escape sonic |
10.57 ms | 1.02× |
escape generic |
17.61 ms | 1.70× |
json-escape |
18.01 ms | 1.74× |
serde_json |
19.00 ms | 1.83× |
escape v_jsonescape |
21.38 ms | 2.06× |