A relatively quiet week for performance, with the notable exception of “Avoid GenFuture
shim when compiling async constructs #104321” which brought sizeable wins on a number of stress test benchmarks. It probably won't be of huge benefit to most codebases, but should provide smaller wins to folks with large amounts of async-generated futures.
Triage done by @simulacrum. Revision range: a78c9bee4d9d51a3891bd8ecae1f28a93b83653b..8a09420ac48658cad726e0a6997687ceac4151e3
Summary:
(instructions:u) | mean | range | count |
---|---|---|---|
Regressions ❌ (primary) | 1.0% | [0.3%, 1.5%] | 11 |
Regressions ❌ (secondary) | 1.8% | [0.4%, 3.0%] | 25 |
Improvements ✅ (primary) | -1.0% | [-3.8%, -0.3%] | 148 |
Improvements ✅ (secondary) | -6.7% | [-87.7%, -0.3%] | 107 |
All ❌✅ (primary) | -0.9% | [-3.8%, 1.5%] | 159 |
3 Regressions, 3 Improvements, 6 Mixed; 2 of them in rollups 43 artifact comparisons made in total
Rollup of 6 pull requests #104758 (Comparison Link)
(instructions:u) | mean | range | count |
---|---|---|---|
Regressions ❌ (primary) | 0.3% | [0.3%, 0.3%] | 1 |
Regressions ❌ (secondary) | 2.1% | [0.6%, 7.1%] | 13 |
Improvements ✅ (primary) | - | - | 0 |
Improvements ✅ (secondary) | - | - | 0 |
All ❌✅ (primary) | 0.3% | [0.3%, 0.3%] | 1 |
This PR was a perf regression (see the report here https://github.com/rust-lang/rust/pull/104758#issuecomment-1325100344). It‘s relatively small and mostly limited to secondary workloads so I’m marking as triaged.
Branch Clause from Predicate #104846 (Comparison Link)
(instructions:u) | mean | range | count |
---|---|---|---|
Regressions ❌ (primary) | 0.8% | [0.2%, 2.4%] | 38 |
Regressions ❌ (secondary) | 0.4% | [0.3%, 0.8%] | 5 |
Improvements ✅ (primary) | - | - | 0 |
Improvements ✅ (secondary) | - | - | 0 |
All ❌✅ (primary) | 0.8% | [0.2%, 2.4%] | 38 |
Unexpected regression, PR reviewer and author are going to look into it.
Add ConstKind::Expr
#99798 (Comparison Link)
(instructions:u) | mean | range | count |
---|---|---|---|
Regressions ❌ (primary) | 0.3% | [0.2%, 0.5%] | 6 |
Regressions ❌ (secondary) | 0.9% | [0.3%, 1.6%] | 21 |
Improvements ✅ (primary) | - | - | 0 |
Improvements ✅ (secondary) | -0.2% | [-0.2%, -0.2%] | 1 |
All ❌✅ (primary) | 0.3% | [0.2%, 0.5%] | 6 |
Previous perf runs showed slight improvements, but the post-merge one shows regressions. They are mostly among secondary benchmarks.
Fix perf regression by correctly matching keywords #104410 (Comparison Link)
(instructions:u) | mean | range | count |
---|---|---|---|
Regressions ❌ (primary) | - | - | 0 |
Regressions ❌ (secondary) | - | - | 0 |
Improvements ✅ (primary) | -0.3% | [-0.5%, -0.2%] | 32 |
Improvements ✅ (secondary) | -0.8% | [-1.1%, -0.5%] | 8 |
All ❌✅ (primary) | -0.3% | [-0.5%, -0.2%] | 32 |
Use an IndexVec to cache queries with index-like key #103808 (Comparison Link)
(instructions:u) | mean | range | count |
---|---|---|---|
Regressions ❌ (primary) | - | - | 0 |
Regressions ❌ (secondary) | - | - | 0 |
Improvements ✅ (primary) | -0.8% | [-2.3%, -0.2%] | 133 |
Improvements ✅ (secondary) | -1.2% | [-7.8%, -0.2%] | 105 |
All ❌✅ (primary) | -0.8% | [-2.3%, -0.2%] | 133 |
Avoid GenFuture
shim when compiling async constructs #104321 (Comparison Link)
(instructions:u) | mean | range | count |
---|---|---|---|
Regressions ❌ (primary) | - | - | 0 |
Regressions ❌ (secondary) | - | - | 0 |
Improvements ✅ (primary) | - | - | 0 |
Improvements ✅ (secondary) | -28.0% | [-87.8%, -1.9%] | 22 |
All ❌✅ (primary) | - | - | 0 |
optimize field ordering by grouping m*2^n
-sized fields with equivalently aligned ones #102750 (Comparison Link)
(instructions:u) | mean | range | count |
---|---|---|---|
Regressions ❌ (primary) | 0.5% | [0.3%, 0.8%] | 4 |
Regressions ❌ (secondary) | 1.2% | [0.3%, 2.3%] | 26 |
Improvements ✅ (primary) | -0.5% | [-2.2%, -0.2%] | 44 |
Improvements ✅ (secondary) | -0.6% | [-1.2%, -0.1%] | 22 |
All ❌✅ (primary) | -0.4% | [-2.2%, 0.8%] | 48 |
Some followup discussion on https://github.com/rust-lang/rust/issues/104807 but overall a roughly neutral change.
privacy: Fix more (potential) issues with effective visibilities #104602 (Comparison Link)
(instructions:u) | mean | range | count |
---|---|---|---|
Regressions ❌ (primary) | 0.3% | [0.2%, 0.3%] | 8 |
Regressions ❌ (secondary) | 2.2% | [0.3%, 3.6%] | 17 |
Improvements ✅ (primary) | -1.0% | [-1.4%, -0.5%] | 13 |
Improvements ✅ (secondary) | - | - | 0 |
All ❌✅ (primary) | -0.5% | [-1.4%, 0.3%] | 21 |
This fixes correctness issues, and the regressions are mostly in unused-warnings which is a stress test where 3% doesn't really matter. Plus libc got a bit faster. So overall, not a performance concern.
Manually implement PartialEq for Option<T>
and specialize non-nullable types #103556 (Comparison Link)
(instructions:u) | mean | range | count |
---|---|---|---|
Regressions ❌ (primary) | 2.1% | [2.1%, 2.1%] | 1 |
Regressions ❌ (secondary) | - | - | 0 |
Improvements ✅ (primary) | -0.3% | [-0.4%, -0.2%] | 2 |
Improvements ✅ (secondary) | -0.3% | [-0.4%, -0.3%] | 2 |
All ❌✅ (primary) | 0.5% | [-0.4%, 2.1%] | 3 |
Relatively few relatively small changes, no further investigation needed.
Stop peeling the last iteration of the loop in Vec::resize_with
#104818 (Comparison Link)
(instructions:u) | mean | range | count |
---|---|---|---|
Regressions ❌ (primary) | 0.8% | [0.8%, 0.8%] | 1 |
Regressions ❌ (secondary) | 0.3% | [0.3%, 0.3%] | 1 |
Improvements ✅ (primary) | -0.3% | [-0.3%, -0.3%] | 3 |
Improvements ✅ (secondary) | -0.3% | [-0.4%, -0.1%] | 7 |
All ❌✅ (primary) | -0.0% | [-0.3%, 0.8%] | 4 |
Perf changes are very small, and wins slightly outweigh losses.
Update VecDeque implementation to use head+len instead of head+tail #102991 (Comparison Link)
(instructions:u) | mean | range | count |
---|---|---|---|
Regressions ❌ (primary) | - | - | 0 |
Regressions ❌ (secondary) | 0.8% | [0.2%, 1.4%] | 4 |
Improvements ✅ (primary) | -0.3% | [-0.5%, -0.2%] | 3 |
Improvements ✅ (secondary) | -0.3% | [-0.5%, -0.2%] | 3 |
All ❌✅ (primary) | -0.3% | [-0.5%, -0.2%] | 3 |
Performance looks like overall neutral to slight win.
Rollup of 6 pull requests #105008 (Comparison Link)
(instructions:u) | mean | range | count |
---|---|---|---|
Regressions ❌ (primary) | 0.6% | [0.2%, 0.9%] | 8 |
Regressions ❌ (secondary) | - | - | 0 |
Improvements ✅ (primary) | -0.9% | [-0.9%, -0.8%] | 2 |
Improvements ✅ (secondary) | -2.4% | [-2.7%, -2.1%] | 6 |
All ❌✅ (primary) | 0.3% | [-0.9%, 0.9%] | 10 |
keccak improvements may be spurious but overall neutral so no further investigation warranted.