Commit 175b8db
committed
Auto merge of rust-lang#88834 - the8472:char-count, r=joshtriplett
optimize str::from_utf8() validation when slice contains multibyte chars and str.chars().count() in all cases
The change shows small but consistent improvements across several x86 target feature levels. I also tried to optimize counting with `slice.as_chunks` but that yielded more inconsistent results, bigger improvements for some optimization levels, lesser ones in others.
```
old, -O2, x86-64
test str::str_char_count_emoji ... bench: 1,924 ns/iter (+/- 26)
test str::str_char_count_lorem ... bench: 879 ns/iter (+/- 12)
test str::str_char_count_lorem_short ... bench: 5 ns/iter (+/- 0)
new, -O2, x86-64
test str::str_char_count_emoji ... bench: 1,878 ns/iter (+/- 21)
test str::str_char_count_lorem ... bench: 851 ns/iter (+/- 11)
test str::str_char_count_lorem_short ... bench: 4 ns/iter (+/- 0)
old, -O2, x86-64-v2
test str::str_char_count_emoji ... bench: 1,477 ns/iter (+/- 46)
test str::str_char_count_lorem ... bench: 675 ns/iter (+/- 15)
test str::str_char_count_lorem_short ... bench: 5 ns/iter (+/- 0)
new, -O2, x86-64-v2
test str::str_char_count_emoji ... bench: 1,323 ns/iter (+/- 39)
test str::str_char_count_lorem ... bench: 593 ns/iter (+/- 18)
test str::str_char_count_lorem_short ... bench: 4 ns/iter (+/- 0)
old, -O2, x86-64-v3
test str::str_char_count_emoji ... bench: 748 ns/iter (+/- 7)
test str::str_char_count_lorem ... bench: 348 ns/iter (+/- 2)
test str::str_char_count_lorem_short ... bench: 5 ns/iter (+/- 0)
new, -O2, x86-64-v3
test str::str_char_count_emoji ... bench: 650 ns/iter (+/- 4)
test str::str_char_count_lorem ... bench: 301 ns/iter (+/- 1)
test str::str_char_count_lorem_short ... bench: 5 ns/iter (+/- 0)
```
and for the multibyte-char string validation:
```
old, -O2, x86-64
test str::str_validate_emoji ... bench: 4,606 ns/iter (+/- 64)
new, -O2, x86-64
test str::str_validate_emoji ... bench: 3,837 ns/iter (+/- 60)
```3 files changed
+39
-7
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
| 18 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
25 | | - | |
| 25 | + | |
26 | 26 | | |
27 | 27 | | |
28 | 28 | | |
| |||
163 | 163 | | |
164 | 164 | | |
165 | 165 | | |
166 | | - | |
| 166 | + | |
167 | 167 | | |
168 | 168 | | |
169 | 169 | | |
| |||
175 | 175 | | |
176 | 176 | | |
177 | 177 | | |
178 | | - | |
| 178 | + | |
179 | 179 | | |
180 | 180 | | |
181 | 181 | | |
| |||
184 | 184 | | |
185 | 185 | | |
186 | 186 | | |
187 | | - | |
| 187 | + | |
188 | 188 | | |
189 | 189 | | |
190 | | - | |
| 190 | + | |
191 | 191 | | |
192 | 192 | | |
193 | 193 | | |
| |||
258 | 258 | | |
259 | 259 | | |
260 | 260 | | |
261 | | - | |
262 | | - | |
263 | 261 | | |
264 | 262 | | |
265 | 263 | | |
| |||
0 commit comments