Which would be the best/fastest way for evaluating the loop condition,orCode:while (i < x)? Assuming that the loop is incrementing i for each iteration, to avoid elitist remarksCode:while (i != x)![]()
This is a discussion on i < x or i != x? within the C Programming forums, part of the General Programming Boards category; Which would be the best/fastest way for evaluating the loop condition, Code: while (i < x) or Code: while (i ...
Which would be the best/fastest way for evaluating the loop condition,orCode:while (i < x)? Assuming that the loop is incrementing i for each iteration, to avoid elitist remarksCode:while (i != x)![]()
Well assuming you know that i will at some point be exactly x, then there is no difference. But consider any possibility that might result in i never equaling x. Such as this:
Code:float i = 0.0; while (i != 1.0) { printf("%.2f\n", i); i += .1; }
Last edited by SlyMaelstrom; 03-04-2006 at 08:28 PM. Reason: Cause I had a for loop last time
Sent from my iPad®
Yes, the value of i will be the same as x's at some point, they are both integers and i is incrementing by one at a time.
I'm not an assembly expert, but I know on at least one architecture (ARM) those will both take exactly the same amount of time; cmp and then beq or bge (or bne vs blt); half a dozen in one hand and 6 in the other.Originally Posted by OnionKnight
But even if some architectures have one compare go faster than the other, don't give it any thought. Micro-optimization is bad. Forget "fastest" and just concentrate on "best" - whatever makes sense, is easy to understand and maintain. Always go good coding style.
hello, internet!
Yes I usually leave stuff like that up to the compiler but I figured that != would be the same as ! and ==, two operations whereas < would be just one but it seems like they actually do the same amount of work.
I've come to the conclusion that I'll use != in loops where the value will become the other at some point and < otherwise.
just for fun:
the first one seems to execute *slightly* faster than the second on my system, but it's negligible. I'd say follow moi's advice.Code:int main(void) { unsigned i, start, stop, first, second, max = UINT_MAX; i = 0; start = clock(); while(i < max) i++; stop = clock(); first = stop - start; i = 0; start = clock(); while(i != max) i++; stop = clock(); second = stop - start; cout << "(i < max): " << first << endl; cout << "(i != max): " << second << endl; }![]()
Code:int main(void){srand(time(0));for(double l=rand(),l0=0,l00=0;;l0+=0.1){for(double l000=0;l000 <1;l000+=.001,l+=((double)rand()/RAND_MAX)/0x64,l00+=((sin(l*0x8*atan(l0)*l000-(l0*0x8*atan (l)))*0.5)+0.5)){l00-=floor(l00);for(size_t l0000=0,l00000=(size_t)(0x50*(l00));l0000<l00000;++l0000 )putchar(0x20);putchar(0x61+(int)((double)rand()/RAND_MAX*0x1a));putchar('\n');}}return 0;}