Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Handling for loop special cases

In Java, C# or C++, suppose we have a very common situation where we need to iterate a large amount of times and execute a function doX, but on only one of the iterations we should execute a function doY.

int index = 123456;
for(int i = 0; i < 1000000; i++)
{
    if(i == index) doY();
    else doX();
}

In situations where I see a real performance issue, I usually break the loop in 2, but this can be very painful, especially if the loop's body is large. Does the compiled code really check for the condition on every iteration, or can it be optimized by the compiler? Furthermore, if index is not a constant at compile time, can there be such optimizations?

like image 743
Æðelstan Avatar asked Dec 24 '22 09:12

Æðelstan


1 Answers

This usually won't cause a huge performance issue. This is due to branch predicting. Refer to this famous question.

Branch predicting is basically assembly's way of guessing which way the if-statement will evaluate to. If it guesses right, it will take almost no time. If it guesses wrong, it will backtrack and cause performance issues. The branch predictor will generally use it's previous branched route as the "guess" for the next branch.

Since your if-statement evaluates to false nearly time. The branch predictor will predict correctly nearly every time.

So to answer your question "Does the compiled code really check for the condition on every iteration?". No it does not. Though it's not optimized by the compiler, but by the assembly pipeline itself.

like image 133
SegFault Avatar answered Dec 28 '22 10:12

SegFault