处理器多久检查一次while循环条件



我知道如果while循环有这样的主体:

while(a<b){
  do_some_calculations
 }

将进行计算,然后再次检查while循环。但是如果我有一个空的while循环:

while(a<b) { }

多久检查一次?我知道while循环编译为cmpjmp指令(需要一到两个周期)。所以它会每1-2个循环检查一次while循环?还是不知道,有些事我不知道?详细的解释会很有帮助。

注:问题是关于低级别的细节。请仔细阅读。我想知道共同的原则,而不是"它是编译器依赖的等等"。

最大功率假设我们有一些有效的条件,并且编译器为它生成了代码。多长时间检查一次?这就是问题所在。

你似乎没有问对问题。如果问题涉及到产生汇编代码的语言,你的答案将是,它取决于编译器,优化级别和某些其他东西,但最重要的是,它将取决于条件。每个循环将执行一次测试。如果该测试包括访问数据库并检查那里的内容,那么执行循环的频率将远远低于根据某些过期时间检查本地时间(作为示例)。如果不进一步了解条件,就不可能得到一般的答案。当然,根据条件的不同,编译器有时能够优化测试,但前提是代码的可见行为不依赖于测试。所以从概念上讲,每次迭代都要检查条件。当然,直到条件返回false,循环结束。

由于标准允许在生成的汇编中有许多解决方案,因此您的问题实际上归结为"编译器做什么",因此只能通过示例来回答。

我使用GCC 4.2.1(基于Apple Inc. build 5658) (LLVM build 2336.11.00)执行了以下测试:

main.cpp:

int main() {
    while (true) { }
}

我用以下命令行编译它:

g++ -S main.cpp

和输出的简化版本main。S,看起来像这样:

LBB1_1:
    jmp  LBB1_1

因此,对于no优化,编译器识别不存在需要检查的条件,因此它只生成一个紧密循环。

我怀疑其他编译器也会做同样的事情,至少在启用了任何优化的情况下。唯一可以确定的方法是检查:)

你的代码将创建一个紧密循环,但如果它是空的,它将只是一个无限循环,就像(;;) -循环没有终止条件,它将吃掉所有的处理器资源或100%/number_of_cores,如果它是多核。在旧的操作系统中,这样的代码能够使整个系统"冻结",但现在所有操作系统的调度程序都是抢占式的,所以它只执行一个时间量子(根据操作系统的不同,从1到200毫秒),在这个量子内,如果主体是空的,并且如果编译器没有因为优化而删除您的条件,它将每2-5个周期执行一次而不会中断。所以我认为,我看到很多人都这么认为你的问题是模糊和不正确的。

它将生成行为的代码,就好像每次迭代都检查了条件。

如果编译器可以证明在每次迭代时检查条件是不必要的,那么它可以取消检查。但这取决于单个编译器,并取决于您提供给它的精确代码。

while循环中,将在进入之前检查条件循环,所以它会比的次数多检查一次执行循环的次数

至少在抽象机器中是这样。编译器允许这样做优化。因此,在您的示例中,如果编译器可以知道ab的值(因为它们被赋值为),那么它可能不会生成任何代码检查一下。如果循环明显不包含任何内容哪一个可以改变条件,它可能产生不检查第一次检查后,既然结果不能改变。唯一的编译器的真正限制是可观察输出就像发生了比较一样。(我认为编译器也可以假定循环终止有时,把代码移到它上面的循环下面,比如)

让我们假设我们有一些有效的条件和编译器为它生成的代码。多长时间检查一次?这就是问题所在。

在每个循环中,如果没有优化,如果有优化并且编译器知道您的条件不会改变,则永远不要。

编译器如何翻译这个与C或c++无关,只要它能工作。如果编译器发现你的循环根本不需要运行,它就可以删除它。它可能展开循环并除去除第一个检查外的所有检查。这完全取决于编译器和代码,没有唯一的答案。

如果编译器没有做任何优化,它将按照标准要求做——在每次迭代开始时检查一次。

最新更新