重复一段代码固定次数

Ser*_*nad 8 c++ performance repeat

我正在尝试重复一段代码,不使用条件,但仍然只重复特定次数.

基本上,这样的事情:

repeat(50)
{
    //Do stuff here.
}
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?除了复制和粘贴50次?

我这样做是因为我想如果我知道有多少次我想重复一些事情,那么每次检查一个条件要快得多.那是准确的吗?或者我还会检查它重复了多少次?

基本上,它是否更快?

pho*_*ger 16

您尝试通过使用某些构造(包括手动剪切和粘贴代码)来优化循环以优化循环的执行速度是不明智的.不要这样做; 它可能会"取消优化"执行速度.

在我遇到过的任何C++实现中(MSVC 6.0,2003,2005,2010,GCC各种版本,Diab各种版本),绝对没有,对不起我没有强调那个,ZERO,时间涉及分配一个循环计数变量,假设为分配循环计数变量的函数分配了任何其他变量.对于一个不进行函数调用的简单循环,循环计数变量甚至可能永远不会将其输出到内存中; 它可以在整个生命周期内完全保存在单个CPU寄存器中.即使它存储在内存中,它也会在运行时堆栈上,并且它的空间(以及任何其他局部变量)将在一次操作中一次性声明,这不会花费更多或更少的时间,具体取决于堆栈上分配的变量.像循环计数器变量这样的局部变量在堆栈上分配,堆栈分配是CHEAP CHEAP CHEAP,而不是堆分配.

堆栈上的示例循环计数器变量分配:

for (int i=0; i<50; ++i) {
    ....
}
Run Code Online (Sandbox Code Playgroud)

堆栈上的另一个示例循环计数器变量分配:

int i = 0;
for (; i<50; ++i) {
    ....
}
Run Code Online (Sandbox Code Playgroud)

在堆上分配的示例循环计数器变量(不要这样做;它是愚蠢的):

int* ip = new int;
for (*ip=0; *ip<50; ++(*ip)) {
    ....
}
delete ip;
Run Code Online (Sandbox Code Playgroud)

现在解决通过手动复制和粘贴而不是使用循环和计数器来尝试优化循环的问题:

你正在考虑做的是循环展开的手动形式.循环展开是编译器有时用于减少循环中涉及的开销的优化.只有在编译时可以知道循环的迭代次数(即迭代次数是常量,即使常量涉及基于其他常量的计算),编译器也可以这样做.在某些情况下,编译器可能会确定展开循环是值得的,但通常它不会完全展开它.例如,在您的示例中,编译器可以确定将循环从50次迭代展开到仅循环体的5个副本的10次迭代将是速度优势.循环变量仍然存在,但是现在代码只需要进行10次比较,而不是对循环计数器进行50次比较.这是一个权衡,因为循环体的5个副本在缓存中占用了5倍的空间,这意味着加载相同指令的额外副本迫使缓存逐出(抛出)已经存在的许多指令缓存以及您可能希望保留在缓存中的缓存.此外,从主存储器加载循环体指令的这4个额外副本所花费的时间比在没有完全展开循环的情况下从缓存中简单地抓取已经加载的指令要长得多.

总而言之,仅使用循环体的一个副本并继续将循环逻辑保持在适当位置通常更有利.(即根本不进行任何循环展开.)