2022-11-29 Triage Log

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)meanrangecount
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

Regressions

Rollup of 6 pull requests #104758 (Comparison Link)

(instructions:u)meanrangecount
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)meanrangecount
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)meanrangecount
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.

Improvements

Fix perf regression by correctly matching keywords #104410 (Comparison Link)

(instructions:u)meanrangecount
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)meanrangecount
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)meanrangecount
Regressions ❌
(primary)
--0
Regressions ❌
(secondary)
--0
Improvements ✅
(primary)
--0
Improvements ✅
(secondary)
-28.0%[-87.8%, -1.9%]22
All ❌✅ (primary)--0

Mixed

optimize field ordering by grouping m*2^n-sized fields with equivalently aligned ones #102750 (Comparison Link)

(instructions:u)meanrangecount
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)meanrangecount
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)meanrangecount
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)meanrangecount
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)meanrangecount
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)meanrangecount
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.