所以基本上我想知道,在C ++语言中这些循环的速度更快? 基本上,这些示例中哪一个编译得更快 -
int S = 1, D = 2, d = 1;
for(int x = 0; x < 10000; x++) {
S += D/2-d *s;
}
和
int S = 1, D = 2, d = 1, x = 0;
while(x < 10000) {
x++;
S += D/2-d * S;
}
答案 0 :(得分:10)
第二个例子可能编译得稍快一些,因为它长76个字符,而不是前77个字符,并且它使用不太复杂的语言结构(通过不那么复杂,我的意思是解析不那么复杂)。
答案 1 :(得分:8)
对于任何半合适的编译器,它应该编译为完全相同的代码。事实上,这个:
for (begin; cond; loop) {
block;
}
在语义上等同于{continue
loop
,正如Seth Carnegie在下面所建议的那样):
{
begin;
while (cond) {
block;
loop;
}
}
答案 2 :(得分:1)
编译时间和执行时间之间存在差异。对于执行时间,现在的编译器很可能生成相同的代码。编译时间......很可能也是一样。
请注意,您的示例不正确。这两个循环不相同。增量首先在while
循环中执行。 for
循环的等价物是:
while(x < 10000) {
S += D/2-d * S;
x++;
}
答案 3 :(得分:0)
能够回答的唯一“人”是分析器。
在更理论的层面上,编译器会将它们归结为相同的低级构造,如果事实上某些编译器在生成IR之前将for
循环转换为while
循环。
答案 4 :(得分:0)
在我的计算机上,此代码的平均差异为4毫秒(小于0.1%)。并且首先是哪个函数,a()或b()并不重要,第一个更慢,所以原因是调度程序如何工作,我认为。
#include <iostream>
#include <QTime>
const long cycles = 1000000000;
void a() {
long s = 0;
for(long x = 0; x < cycles; x++) {
s++;
}
}
void b() {
long x = 0;
long s= 0;
while(x < cycles) {
x++;
s++;
}
}
int main(int argc, char *argv[])
{
QTime t1;
t1.start();
b();
int i1 = t1.elapsed();
t1.restart();
a();
int i2 = t1.elapsed();
std::cout << i1 <<"\n"<< i2 <<"\n---\n";
return 0;
}