这是一位高级经理在面试时问的问题。

哪个更快?

while(1) {
    // Some code
}

or

while(2) {
    //Some code
}

我说过两者具有相同的执行速度,因为while中的表达式最终应求值为true或false。在这种情况下,两者都求值为true,并且while条件中没有额外的条件指令。因此,两者将具有相同的执行速度,我更喜欢while(1)。

但面试官自信地说: “检查你的基本知识。While(1)比While(2)快。” (他不是在试探我的信心)

这是真的吗?

请参见:“for(;;)”是否比“while (TRUE)”快?如果不是,人们为什么要使用它?


当前回答

这里有一个问题:如果您实际编写一个程序并测量它的速度,两个循环的速度可能是不同的!以下是一些合理的比较:

unsigned long i = 0;
while (1) { if (++i == 1000000000) break; }

unsigned long i = 0;
while (2) { if (++i == 1000000000) break; }

添加了一些打印时间的代码后,一些随机的效果(比如循环在一条或两条缓存线中的位置)可能会产生影响。一个循环可能完全位于一条缓存线内,或者位于一条缓存线的开头,或者它可能横跨两条缓存线。因此,面试官说最快的可能真的是最快的——纯属巧合。

最坏的情况:优化编译器不知道循环做了什么,但知道执行第二个循环时产生的值与第一个循环产生的值相同。并为第一个循环生成完整代码,但不为第二个循环生成完整代码。

其他回答

我曾经用C语言和汇编代码编写程序,那时候这类废话可能会有很大不同。当它确实起作用时,我们在汇编中写了出来。

如果我被问到这个问题,我会重复唐纳德·克努特1974年关于过早优化的名言,如果面试官没有笑,我就会走开,然后继续前进。

在我看来,这是一个被伪装成技术问题的行为面试问题。有些公司会这样做——他们会问一个任何有能力的程序员都应该很容易回答的技术问题,但是当面试者给出正确答案时,面试官会告诉他们他们错了。

公司想看看你在这种情况下会作何反应。你是否会因为自我怀疑或害怕让面试官不高兴而安静地坐在那里,不强调自己的答案是正确的?或者你愿意挑战一个你知道是错误的权威人士吗?他们想看看你是否愿意坚持自己的信念,以及你是否能以一种机智和尊重的方式做到这一点。

这取决于编译器。

如果它优化了代码,或者对于一个特定的指令集,如果它用相同数量的指令计算1和2为真,那么执行速度将是相同的。

在实际情况下,它总是同样快,但可以想象在特定的编译器和特定的系统中,这将得到不同的计算。

我的意思是:这不是一个与语言(C)相关的问题。

为了这个问题,我应该补充一点,我记得C委员会的Doug Gwyn写过,一些早期的C编译器如果没有优化器通道,会在汇编中生成一个while(1)的测试(相比之下,For(;;)没有它)。

我会给出这个历史笔记来回答面试官,然后说,即使我对任何编译器这样做感到非常惊讶,编译器也可以这样做:

没有优化器,通过编译器生成while(1)和while(2)测试 通过优化器传递,编译器被指示优化(无条件跳转),而(1),因为它们被认为是惯用的。这将使while(2)只剩下一个测试,从而导致两者之间的性能差异。

当然,我要向面试官补充的是,不考虑while(1)和while(2)相同的结构是低质量优化的标志,因为它们是等效的结构。

关于这个问题的另一个答案是,看看你是否有勇气告诉你的经理他/她错了!以及你能多温柔地交流。

我的第一直觉是生成汇编输出,向管理器显示任何像样的编译器都应该照顾它,如果它不这样做,你将提交它的下一个补丁:)