Skip to content

Commit 931286d

Browse files
committed
docs: update benchmark result
1 parent d4d94e3 commit 931286d

File tree

2 files changed

+90
-51
lines changed

2 files changed

+90
-51
lines changed

README.md

Lines changed: 86 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -14,88 +14,138 @@ Numbers below come from `cargo bench` runs on GitHub Actions hardware. Criterion
1414

1515
`AVX2` enabled.
1616

17+
**Short string payload (~89M iterations)**
18+
19+
| Implementation | Median time | vs fastest |
20+
| --------------------- | ------------ | ---------- |
21+
| **`escape simd`** | **56.23 ns** | **1.00×** |
22+
| `escape generic` | 111.58 ns | 1.98× |
23+
| `serde_json` | 111.65 ns | 1.99× |
24+
| `json-escape` | 140.01 ns | 2.49× |
25+
| `escape v_jsonescape` | 151.98 ns | 2.70× |
26+
| `escape sonic` | 202.21 ns | 3.60× |
27+
1728
**RxJS payload (~10k iterations)**
1829

1930
| Implementation | Median time | vs fastest |
2031
| --------------------- | ------------- | ---------- |
21-
| **`escape simd`** | **341.18 µs** | **1.00×** |
22-
| `escape v_jsonescape` | 555.47 µs | 1.63× |
23-
| `escape generic` | 656.85 µs | 1.93× |
24-
| `serde_json` | 744.75 µs | 2.18× |
25-
| `json-escape` | 777.15 µs | 2.28× |
32+
| **`escape simd`** | **246.84 µs** | **1.00×** |
33+
| `escape sonic` | 261.87 µs | 1.06× |
34+
| `escape v_jsonescape` | 531.77 µs | 2.15× |
35+
| `json-escape` | 561.93 µs | 2.28× |
36+
| `escape generic` | 664.00 µs | 2.69× |
37+
| `serde_json` | 649.19 µs | 2.63× |
2638

2739
**Fixtures payload (~300 iterations)**
2840

29-
| Implementation | Median time | vs fastest |
30-
| --------------------- | ------------ | ---------- |
31-
| **`escape simd`** | **12.67 ms** | **1.00×** |
32-
| `escape v_jsonescape` | 20.58 ms | 1.62× |
33-
| `escape generic` | 22.57 ms | 1.78× |
34-
| `serde_json` | 24.52 ms | 1.94× |
35-
| `json-escape` | 26.97 ms | 2.13× |
41+
| Implementation | Median time | vs fastest |
42+
| --------------------- | ------------- | ---------- |
43+
| **`escape simd`** | **9.1461 ms** | **1.00×** |
44+
| `escape sonic` | 9.3410 ms | 1.02× |
45+
| `json-escape` | 19.077 ms | 2.09× |
46+
| `escape v_jsonescape` | 20.015 ms | 2.19× |
47+
| `serde_json` | 21.240 ms | 2.32× |
48+
| `escape generic` | 22.512 ms | 2.46× |
3649

3750
### GitHub Actions aarch64 (`ubuntu-24.04-arm`)
3851

3952
Neon enabled.
4053

54+
**Short string payload (~76M iterations)**
55+
56+
| Implementation | Median time | vs fastest |
57+
| --------------------- | ------------ | ---------- |
58+
| **`escape simd`** | **65.42 ns** | **1.00×** |
59+
| `escape generic` | 108.28 ns | 1.66× |
60+
| `serde_json` | 110.73 ns | 1.69× |
61+
| `json-escape` | 150.64 ns | 2.30× |
62+
| `escape v_jsonescape` | 183.41 ns | 2.80× |
63+
| `escape sonic` | 212.87 ns | 3.25× |
64+
4165
**RxJS payload (~10k iterations)**
4266

4367
| Implementation | Median time | vs fastest |
4468
| --------------------- | ------------- | ---------- |
45-
| **`escape generic`** | **546.89 µs** | **1.00×** |
46-
| `escape simd` | 589.29 µs | 1.08× |
47-
| `serde_json` | 612.33 µs | 1.12× |
48-
| `json-escape` | 624.66 µs | 1.14× |
49-
| `escape v_jsonescape` | 789.14 µs | 1.44× |
69+
| **`escape simd`** | **283.40 µs** | **1.00×** |
70+
| `escape sonic` | 305.34 µs | 1.08× |
71+
| `json-escape` | 468.04 µs | 1.65× |
72+
| `escape generic` | 548.50 µs | 1.94× |
73+
| `serde_json` | 567.23 µs | 2.00× |
74+
| `escape v_jsonescape` | 758.18 µs | 2.68× |
5075

5176
**Fixtures payload (~300 iterations)**
5277

5378
| Implementation | Median time | vs fastest |
54-
| --------------------- | ------------ | ---------- |
55-
| **`escape generic`** | **17.81 ms** | **1.00×** |
56-
| `serde_json` | 19.77 ms | 1.11× |
57-
| `json-escape` | 20.84 ms | 1.17× |
58-
| `escape simd` | 21.04 ms | 1.18× |
59-
| `escape v_jsonescape` | 25.57 ms | 1.44× |
79+
| --------------------- | ------------- | ---------- |
80+
| **`escape simd`** | **10.46 ms** | **1.00×** |
81+
| `escape sonic` | 11.18 ms | 1.07× |
82+
| `json-escape` | 15.45 ms | 1.48× |
83+
| `escape generic` | 17.75 ms | 1.70× |
84+
| `serde_json` | 18.01 ms | 1.72× |
85+
| `escape v_jsonescape` | 24.93 ms | 2.38× |
6086

6187
### GitHub Actions macOS (`macos-latest`)
6288

6389
> Apple M1 chip
6490
91+
**Short string payload (~45M iterations)**
92+
93+
| Implementation | Median time | vs fastest |
94+
| --------------------- | ------------- | ---------- |
95+
| **`escape simd`** | **113.16 ns** | **1.00×** |
96+
| `serde_json` | 128.52 ns | 1.14× |
97+
| `escape generic` | 136.06 ns | 1.20× |
98+
| `json-escape` | 173.16 ns | 1.53× |
99+
| `escape v_jsonescape` | 198.80 ns | 1.76× |
100+
| `escape sonic` | 226.21 ns | 2.00× |
101+
65102
**RxJS payload (~10k iterations)**
66103

67104
| Implementation | Median time | vs fastest |
68105
| --------------------- | ------------- | ---------- |
69-
| **`escape generic`** | **759.07 µs** | **1.00×** |
70-
| `escape simd` | 764.98 µs | 1.01× |
71-
| `serde_json` | 793.91 µs | 1.05× |
72-
| `json-escape` | 868.21 µs | 1.14× |
73-
| `escape v_jsonescape` | 926.00 µs | 1.22× |
106+
| **`escape sonic`** | **379.94 µs** | **1.00×** |
107+
| `escape simd` | 395.41 µs | 1.04× |
108+
| `json-escape` | 618.74 µs | 1.63× |
109+
| `escape generic` | 690.86 µs | 1.82× |
110+
| `serde_json` | 720.05 µs | 1.89× |
111+
| `escape v_jsonescape` | 839.86 µs | 2.21× |
74112

75-
**Fixtures payload (~300 iterations)**
113+
**AFFiNE sources payload (~300 iterations)**
76114

77115
| Implementation | Median time | vs fastest |
78116
| --------------------- | ------------ | ---------- |
79-
| **`serde_json`** | **26.41 ms** | **1.00×** |
80-
| `escape generic` | 26.43 ms | 1.00× |
81-
| `escape simd` | 26.42 ms | 1.00× |
82-
| `json-escape` | 28.94 ms | 1.10× |
83-
| `escape v_jsonescape` | 29.22 ms | 1.11× |
117+
| **`escape simd`** | **12.60 ms** | **1.00×** |
118+
| `escape sonic` | 14.04 ms | 1.11× |
119+
| `json-escape` | 21.54 ms | 1.71× |
120+
| `serde_json` | 23.33 ms | 1.85× |
121+
| `escape generic` | 24.55 ms | 1.95× |
122+
| `escape v_jsonescape` | 26.82 ms | 2.13× |
84123

85124
### Apple M3 Max
86125

126+
**Short string benchmark**
127+
128+
| Implementation | Median time | vs fastest |
129+
| --------------------- | ------------- | ---------- |
130+
| **`escape simd`** | **90.58 ns** | **1.00×** |
131+
| `serde_json` | 139.23 ns | 1.54× |
132+
| `escape generic` | 146.15 ns | 1.61× |
133+
| `json-escape` | 173.60 ns | 1.92× |
134+
| `escape v_jsonescape` | 198.60 ns | 2.19× |
135+
| `escape sonic` | 199.27 ns | 2.20× |
136+
87137
**RxJS payload (~10k iterations)**
88138

89139
| Implementation | Median time | vs fastest |
90140
| --------------------- | ------------- | ---------- |
91141
| **`escape simd`** | **196.07 µs** | **1.00×** |
92142
| `escape sonic` | 196.32 µs | 1.00× |
143+
| `json-escape` | 446.94 µs | 2.28× |
93144
| `escape generic` | 488.37 µs | 2.49× |
94145
| `serde_json` | 553.08 µs | 2.82× |
95146
| `escape v_jsonescape` | 618.31 µs | 3.15× |
96-
| `json-escape` | 446.94 µs | 2.28× |
97147

98-
**Fixtures payload (~300 iterations)**
148+
**AFFiNE sources payload (~300 iterations)**
99149

100150
| Implementation | Median time | vs fastest |
101151
| --------------------- | ------------ | ---------- |
@@ -105,14 +155,3 @@ Neon enabled.
105155
| `json-escape` | 18.01 ms | 1.74× |
106156
| `serde_json` | 19.00 ms | 1.83× |
107157
| `escape v_jsonescape` | 21.38 ms | 2.06× |
108-
109-
**Short string benchmark**
110-
111-
| Implementation | Median time | vs fastest |
112-
| --------------------- | ------------- | ---------- |
113-
| **`escape simd`** | **90.58 ns** | **1.00×** |
114-
| `serde_json` | 139.23 ns | 1.54× |
115-
| `escape generic` | 146.15 ns | 1.61× |
116-
| `json-escape` | 173.60 ns | 1.92× |
117-
| `escape v_jsonescape` | 198.60 ns | 2.19× |
118-
| `escape sonic` | 199.27 ns | 2.20× |

benches/escape.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ fn get_rxjs_sources() -> Vec<String> {
1919
sources
2020
}
2121

22-
fn get_fixture_sources() -> Vec<String> {
22+
fn get_affine_sources() -> Vec<String> {
2323
let ts_paths = glob::glob("fixtures/**/*.ts").unwrap();
2424
let tsx_paths = glob::glob("fixtures/**/*.tsx").unwrap();
2525
let js_paths = glob::glob("fixtures/**/*.js").unwrap();
@@ -107,8 +107,8 @@ fn rxjs_benchmark(c: &mut Criterion) {
107107
}
108108
}
109109

110-
fn fixtures_benchmark(c: &mut Criterion) {
111-
let sources = get_fixture_sources();
110+
fn affine_sources_benchmark(c: &mut Criterion) {
111+
let sources = get_affine_sources();
112112
if !sources.is_empty() {
113113
run_benchmarks(c, &sources, "fixtures");
114114
}
@@ -118,6 +118,6 @@ criterion_group!(
118118
benches,
119119
short_string_benchmark,
120120
rxjs_benchmark,
121-
fixtures_benchmark
121+
affine_sources_benchmark
122122
);
123123
criterion_main!(benches);

0 commit comments

Comments
 (0)