skipping a statemnet from inside a repeating block
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Sat Feb 16 10:15:55 PST 2013
On 2/16/13 12:21 PM, Gopan wrote:
> For iterating through a ranges of indices in a circular way, I have seen
> people coding like
>
> int i=0;
> while(true)
> {
> ...
> i = (i+1)%10;
> }
>
> People argue i = (i+1)%10 is less costly to the combination below.
> ++i;
> if(i==10)
> i = 0;
>
> If the comparison instruction takes only one cycle, how is this argument
> correct? Please let me know if that argument is incorrect.
>
> Thanks,
> Gopan.
The general argument is that code with branches may be slower than
straight-line code on superscalar architectures. In this particular case
the test-based code is likely to be cheaper, which can be easily shown
by profiling. For details paste this:
uint fun1(uint x) {
return (x + 1) % 10;
}
uint fun2(uint x) {
return x == 10 ? 0 : x + 1;
}
into http://d.godbolt.org and take a look at the generated code. It
contains no jumps.
Andrei
More information about the Digitalmars-d
mailing list