处理器在循环条件下检查的频率是多少?

时间:2013-03-21 11:42:41

标签: c++ c assembly processor

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

while(a<b){
  do_some_calculations
 }

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

while(a<b) { }

检查条件的频率是多少?我知道while循环编译为cmpjmp指令(需要一到两个循环)。所以它会检查while循环每1-2个循环?或者不是,有些东西我不知道?细节解释将非常有帮助。

P.S。问题是关于低级细节。请仔细阅读。我想知道共同的原则,而不是“它依赖于编译器等等”。

P.P.S让我们假设我们有一些有效的条件和编译器为它生成的代码。它会检查它吗?这就是问题。

7 个答案:

答案 0 :(得分:4)

由于标准允许在生成的程序集中提供许多解决方案,因此您的问题实际上归结为“编译器做了什么?”因此只能通过例子来回答。

我使用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 优化,编译器会识别出没有要检查的条件,因此它只会生成一个紧密的循环。

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

答案 1 :(得分:4)

你似乎没有问正确的问题。如果问题涉及产生汇编代码的语言,那么答案将取决于编译器,优化级别和某些其他事情,但最重要的是,它将取决于 条件 即可。每个循环将进行一次测试。如果该测试包括进入数据库并在那里检查某些内容,则执行循环的频率远低于在某个到期时间内检查本地时间的情况(例如)。如果不进一步了解 条件 ,则无法得出一般答案。当然,根据条件,编译器有时可以优化测试,但前提是代码的可见行为不依赖于它。因此,从概念上讲,仍然会在每次迭代时检查条件。当然,直到条件产生错误并且循环结束。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

while循环中,将在输入之前检查条件 循环,因此将再次检查它的数量 你经历循环的时候。

至少在抽象机器上。允许编译器 优化。因此,在您的示例中,如果编译器可以知道 ab的值(因为例如它们已被分配 紧接着之前的常量),然后它可能不生成代码 做检查。如果循环显然不包含任何东西 这可以改变条件,它可能不会产生任何检查 第一次检查后,由于结果无法改变。唯一的 编译器的实际限制是可观察的输出 与进行比较的情况相同。 (我觉得 编译器也允许假设循环终止 有时候,将代码移到它上面的循环之下,等等 那个。)

答案 5 :(得分:0)

  

让我们假设我们有一些有效的条件和编译器为它生成的代码.HOW OFTEN它会检查它吗?这就是问题。

如果没有优化,在每个循环中,永远不会有优化,编译器会理解你的条件不会改变。

答案 6 :(得分:0)

编译器如何转换它与C或C ++无关,只要它有效。如果编译器可以看到你的循环根本不需要运行,它就可以删除它。它可以展开循环并完全删除除第一个检查之外的所有内容。这一切都取决于编译器和代码,并没有单一的答案。

如果编译器根本不进行优化,它将按照标准要求进行 - 在每次迭代开始时进行一次检查。