编程循环结构中<与!=的效率比较

记得以前好像是在某个国外的wiki上看到在for循环中用“!=”比用“<”可以带来更好的性能,从那以后是深信不疑一直用不等于来做循环的判断,知道近期学了汇编之后才了解到这个说法并不完全准确。真正的结论是这两个比较方法效率上差不多。

我自己先弄了以下这个测试的C的代码,内容很简单,分别写了两个for循环,一个用不等于做判断,另一个用小于做判断。


#include 

int main() {

    int i;

    for (i = 0; i < 5; i++) {

        printf("< %d\n", i);

    }

    for (i = 0; i != 5; i++) {

        printf("!= %d\n", i);

    }

    return 0;

}

先编译成一个可执行文件后,用反汇编工具进行反汇编,通过查看汇编的源码可知不等于和小于的比较用的都是CMP指令,通过把栈里两个数相减来判断标志寄存器的状态。唯一的区别在于CMP后面跟了判断什么标志位的指令,其实后续具体跟了什么指令和编译器的做法有关,我试了一下在windows上和mac上是略微有些区别的。

windows的情况下小于的判断使用JLE指令,而不等于的判断使用的是JNZ指令,JNZ指令判断标志寄存器的ZF标志位是否为0,两个数的差如果为0的话ZF标志位为1;而JLE其实是小于等于判断,编译器优化为判断小于等于4了,除了看ZF标志位以外还要看SF和OF的标志位,通过查看两个数的差是正是负以及是否有溢出来判断大小。

你可能感兴趣的:(编程循环结构中<与!=的效率比较)