Repository navigation
Commit 9ffd63d
authored
perf: optimize building out-of-line views in
# Which issue does this PR close?
- Split out from #11656
- Related to #11770
# Rationale for this change
This PR applies the optimization from #11770 to an additional code path:
when `MutableArrayData` copies string views into an array that already
has data buffers, the buffer index in the copied views must be updated.
We previously did that by unpacking the raw view (`u128` -> `ByteView`),
adding the buffer index offset, and repacking the view. It is faster to
do this by using bitwise shifts and addition directly. This also avoids
a data-dependent branch, which seems to have been poorly predicted on
x86.
Benchmarks:
x86 (AMD EPYC Milan):
- zip_kernels, string views, 8192 rows of 3 to 19 bytes
- array vs scalar
- all_true: 31.19 µs → 6.41 µs (−79.4%)
- 99pct_true: 35.84 µs → 10.94 µs (−69.5%)
- 90pct_true: 63.87 µs → 39.54 µs (−38.1%)
- 50pct_true: 129.4 µs → 113.1 µs (−12.6%)
- true_then_false: 55.02 µs → 43.06 µs (−21.7%)
- 10pct_true: 96.03 µs → 92.53 µs (−3.6%)
- 1pct_true: 81.66 µs → 82.20 µs (+0.7%)
- all_false: 78.78 µs → 81.76 µs (+3.8%) (runs 6.7% apart)
- 50pct_nulls: 112.6 µs → 107.5 µs (−4.5%) (runs 6.4% apart)
- scalar vs array
- all_true: 82.50 µs → 85.26 µs (+3.3%) (runs 4.4% apart)
- 99pct_true: 86.52 µs → 87.81 µs (+1.5%) (runs 4.4% apart)
- 90pct_true: 100.9 µs → 112 µs (+11.0%) (runs 31.5% apart)
- 50pct_true: 136.6 µs → 121 µs (−11.4%) (runs 5.6% apart)
- true_then_false: 58.65 µs → 47.93 µs (−18.3%) (runs 7.2% apart)
- 10pct_true: 69.18 µs → 44.68 µs (−35.4%) (runs 5.1% apart)
- 1pct_true: 39.66 µs → 15.05 µs (−62.1%) (runs 18.5% apart)
- all_false: 30.34 µs → 7.15 µs (−76.4%) (runs 17.9% apart)
- 50pct_nulls: 102.3 µs → 81.27 µs (−20.6%) (runs 8.6% apart)
- array vs array
- all_true: 30.94 µs → 6.82 µs (−77.9%) (runs 2.6% apart)
- 99pct_true: 37.47 µs → 12.13 µs (−67.6%) (runs 2.8% apart)
- 90pct_true: 71.25 µs → 45.33 µs (−36.4%) (runs 13.0% apart)
- 50pct_true: 77.46 µs → 79.37 µs (+2.5%) (runs 2.9% apart)
- true_then_false: 31.60 µs → 7.00 µs (−77.9%) (runs 3.5% apart)
- 10pct_true: 72.32 µs → 47.72 µs (−34.0%) (runs 25.3% apart)
- 1pct_true: 37.44 µs → 12.04 µs (−67.8%) (runs 5.9% apart)
- all_false: 31.26 µs → 7.01 µs (−77.6%) (runs 4.9% apart)
- 50pct_nulls: 77.66 µs → 78.57 µs (+1.2%)
- mutable_array
- mutable str_view 1024: 294.5 µs → 267.7 µs (−9.1%)
- mutable str_view short slices 1024: 19.84 µs → 17.69 µs (−10.9%) (runs
4.3% apart)
ARM (M4 Max):
- zip_kernels, string views, 8192 rows of 3 to 19 bytes
- array vs scalar
- all_true: 4.27 µs → 3.55 µs (−16.9%) (runs 2.9% apart)
- 99pct_true: 7.22 µs → 6.61 µs (−8.4%) (runs 5.6% apart)
- 90pct_true: 23.69 µs → 22.70 µs (−4.2%)
- 50pct_true: 63.98 µs → 64.23 µs (+0.4%)
- true_then_false: 25.21 µs → 25.53 µs (+1.3%) (runs 3.9% apart)
- 10pct_true: 53.92 µs → 56.04 µs (+3.9%) (runs 6.1% apart)
- 1pct_true: 49.47 µs → 51.00 µs (+3.1%) (runs 4.0% apart)
- all_false: 45.95 µs → 46.10 µs (+0.3%)
- 50pct_nulls: 60.34 µs → 60.33 µs (−0.0%)
- scalar vs array
- all_true: 49.63 µs → 50.10 µs (+0.9%)
- 99pct_true: 53.14 µs → 53.63 µs (+0.9%)
- 90pct_true: 57.90 µs → 58.62 µs (+1.2%)
- 50pct_true: 68.40 µs → 68.32 µs (−0.1%)
- true_then_false: 28.06 µs → 28.33 µs (+1.0%) (runs 3.7% apart)
- 10pct_true: 27.70 µs → 27.16 µs (−2.0%) (runs 3.4% apart)
- 1pct_true: 10.63 µs → 10.11 µs (−4.9%) (runs 6.1% apart)
- all_false: 4.22 µs → 3.58 µs (−15.3%) (runs 6.1% apart)
- 50pct_nulls: 47.07 µs → 46.42 µs (−1.4%) (runs 2.7% apart)
- array vs array
- all_true: 4.40 µs → 3.59 µs (−18.3%)
- 99pct_true: 7.51 µs → 6.97 µs (−7.2%) (runs 7.4% apart)
- 90pct_true: 24.69 µs → 24.15 µs (−2.2%) (runs 7.6% apart)
- 50pct_true: 49.95 µs → 51.71 µs (+3.5%) (runs 11.4% apart)
- true_then_false: 4.50 µs → 3.64 µs (−18.9%)
- 10pct_true: 24.68 µs → 23.40 µs (−5.2%)
- 1pct_true: 7.63 µs → 6.79 µs (−11.1%) (runs 3.1% apart)
- all_false: 4.38 µs → 3.60 µs (−17.7%) (runs 2.2% apart)
- 50pct_nulls: 49.16 µs → 50.45 µs (+2.6%) (runs 4.2% apart)
- mutable_array
- mutable str_view 1024: 186.4 µs → 156.2 µs (−16.2%) (runs 6.3% apart)
- mutable str_view short slices 1024: 10.49 µs → 10.04 µs (−4.3%) (runs
4.7% apart)
# What changes are included in this PR?
See above.
# Are these changes tested?
Yes. `test_string_view` now covers strings of 12 and 13 bytes, on either
side of the inline limit, copied from the second input.
# Are there any significant user-facing changes?
No.MutableArrayData (#11992)1 parent 7613943 commit 9ffd63d
2 files changed
Lines changed: 20 additions & 16 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
23 | | - | |
| 23 | + | |
24 | 24 | | |
25 | 25 | | |
26 | 26 | | |
| |||
228 | 228 | | |
229 | 229 | | |
230 | 230 | | |
231 | | - | |
232 | | - | |
233 | | - | |
234 | | - | |
235 | | - | |
236 | | - | |
237 | | - | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
238 | 244 | | |
239 | 245 | | |
240 | 246 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1065 | 1065 | | |
1066 | 1066 | | |
1067 | 1067 | | |
1068 | | - | |
1069 | | - | |
1070 | | - | |
1071 | | - | |
1072 | | - | |
1073 | | - | |
| 1068 | + | |
| 1069 | + | |
| 1070 | + | |
| 1071 | + | |
1074 | 1072 | | |
1075 | 1073 | | |
1076 | 1074 | | |
| |||
1091 | 1089 | | |
1092 | 1090 | | |
1093 | 1091 | | |
1094 | | - | |
| 1092 | + | |
1095 | 1093 | | |
1096 | 1094 | | |
1097 | | - | |
| 1095 | + | |
1098 | 1096 | | |
1099 | 1097 | | |
1100 | 1098 | | |
| |||
0 commit comments