c语言程序循环运行指定次数,c – 重复一段代码固定次数

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

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

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

for (int i=0; i<50; ++i) {

....

}

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

int i = 0;

for (; i<50; ++i) {

....

}

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

int* ip = new int;

for (*ip=0; *ip<50; ++(*ip)) {

....

}

delete ip;

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值