I stumbled upon this piece of code in .NET's List source code:
// Following trick can reduce the range check by one
if ((uint) index >= (uint)_size) {
ThrowHelper.ThrowArgumentOutOfRangeException();
}
Apparently this is more efficient (?) than if (index < 0 || index >= _size)
I am curious about the rationale behind the trick. Is a single branch instruction really more expensive than two conversions to uint
? Or is there some other optimization going on that will make this code faster than an additional numeric comparison?
To address the elephant in the room: yes, this is micro optimization, no I do not intend to use this everywhere in my code – I'm just curious ;)
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…