wg
wg copied to clipboard
Branch prediction hints (i.e. Likely/Unlikely)
In some performance sensitive code, hinting to the compiler that a certain path is likely or unlikely to be taken can be a helpful optimization:
- Sometimes the unlikely path is extremely unlikely/unintended (for example, a fixed-size object pool being full, trying to normalize a 0-length vector). Sometimes, the path is completely unreachable.
- Sometimes you may want to optimize for the unlikely path - for example a spin loop waiting for an event.
There is a discussion here: https://github.com/rust-lang/rust/issues/26179
The RFC was accepted but the intrinsics are not stabilized, I think mainly because:
- The LLVM team recommends (and clang uses) branch weights instead. (These intrinsics disable certain optimizations in LLVM, which might defeat the purpose of using them.)
- This doesn't support hinting
if letormatchstatements.
Workarounds:
- Compiler intrinsics
std::intrinsics::likelyandstd::intrinsics::unlikelyare available in nightly, even though they could be harmful the way they work now -
#[cold]will hint to llvm that a certain path is less likely to be called. This also prevents inlining which can reduce icache pressure -
unreachable!()andunreachable_unchecked!()are worth considering for the unreachable case. It's not clear to me if unreachable!() does any optimization, but unreachable_unchecked does. (not sure, but probably via llvm'sassume) - Profile-guided optimization
My crate nudge is possibly a good workaround for now. It does not require nightly.