布尔比较的效率?在C.

Wol*_*fin 4 c optimization performance loops while-loop

我正在用C编写一个循环,我只是想知道如何优化它.这里并不重要,因为我只是练习,但为了进一步了解,我想知道:

在循环中,例如以下代码段:

int i = 0;
while (i < 10) {
    printf("%d\n", i);
    i++;
}
Run Code Online (Sandbox Code Playgroud)

请问处理器同时检查(i < 10)(i == 10)每次迭代?或者它只是检查(i < 10),如果是真的,继续?

如果它同时检查两者,则不会:

int i = 0;
while (i != 10) {
    printf("%d\n", i);
    i++;
}
Run Code Online (Sandbox Code Playgroud)

更有效率?

谢谢!

mou*_*iel 10

两者都将在单个汇编指令中翻译.对于EQUAL和NOT EQUAL,大多数CPU都有比LESS THAN更少或者等于的比较指令.


Mic*_*urr 5

关于这些优化问题的一个有趣的事情是,它们经常说明为什么在编写这些操作的性能影响之前应该编写清晰度/正确性的代码(这通常没有任何区别).

您的2个示例循环不具有相同的行为:

int i = 0;
/* this will print 11 lines (0..10) */
while (i <= 10) {
    printf("%d\n", i);
    i++;
}
Run Code Online (Sandbox Code Playgroud)

和,

int i = 0;
/* This will print 10 lines (0..9) */
while (i != 10) {
    printf("%d\n", i);
    i++;
}
Run Code Online (Sandbox Code Playgroud)

为了回答你的问题,几乎可以肯定这两个结构的性能是相同的(假设你修复了问题,所以循环计数是相同的).例如,如果您的处理器只能在两个单独的步骤(这将是一个非常不寻常的处理器)中检查相等以及一个值是否小于另一个值,那么编译器可能会将其转换(i <= 10)(i < 11)测试 - 或者可能是(i != 11)测试.