如果我有一个我知道需要执行的循环n次有没有办法写一个while(或for)循环而不进行每次比较?如果没有,有办法进行宏转:
int i = 0;
for(i = 0; i < 5; i++) {
operation();
}
Run Code Online (Sandbox Code Playgroud)
成:
operation();
operation();
operation();
operation();
operation();
Run Code Online (Sandbox Code Playgroud)
PS这是迄今为止我提出的最快的循环.
int i = 5;
while(i-- >= 0) {
operation();
}
Run Code Online (Sandbox Code Playgroud)
一个足够智能的编译器将为您完成此任务.更具体地说,优化编译器可以理解循环展开.这是一个相当基本的优化,特别是在你的例子中,在编译时已知迭代次数.
简而言之:打开编译器优化并且不用担心它.
您在源代码中编写的指令数与编译器将生成的机器指令数量并不严格相关.
大多数编译器更智能,在第二个示例中可以生成如下代码:
operation();
operation();
operation();
operation();
operation();
Run Code Online (Sandbox Code Playgroud)
自动,因为他们检测到循环将总是迭代5次.
此外,如果您进行面向剖析的优化,并且编译器发现循环具有很小的正文和非常高的重复计数,它甚至可以使用以下代码进行通用迭代次数的展开:
while (count >= 5) {
operation();
operation();
operation();
operation();
operation();
count -= 5;
}
while (count > 0) {
operation();
count--;
}
Run Code Online (Sandbox Code Playgroud)
count
与天真版本相比,这将使大约五分之一的测试成为可能.
如果值得做或不做,那就是只能进行分析的东西.
如果您确定代码需要至少执行一次,那么您可以做的一件事就是写
do {
operation();
} while (--count);
Run Code Online (Sandbox Code Playgroud)
代替
while (count--) {
operation();
}
Run Code Online (Sandbox Code Playgroud)
count==0
对于CPU来说有点烦人的可能性,因为大多数编译器生成的代码需要一个额外的JMP转发:
jmp test
loop:
...operation...
test:
...do the test...
jne loop
Run Code Online (Sandbox Code Playgroud)
do { ... } while
相反,版本的机器代码很简单
loop:
... opertion ...
... do the test...
jne loop
Run Code Online (Sandbox Code Playgroud)