while 和 do ...while
用while循环时有以下两种循环形式:
unsigned int i;
i=0;
while (i< 1000)
{
i++;
//用户程序
}
或:
unsigned int i;
i=1000;
do
{
i--;
//用户程序
}
while (i >0);
在这两种循环中,使用do…while循环编译后生成的代码的长度短于while循环,而且do...while循环大多数时候更可靠,具备更好的容错性。
适当的对循环做展开
这是经典的速度优化,但许多编译程序(如gcc -funroll-loops)能自动完成这个事,所以现在你自己来优化这个显得效果不明显。
旧代码:
for (i = 0; i < 100; i++)
{
do_stuff(i);
}
新代码:
for (i = 0; i < 10; )
{
do_stuff(i); i++;
do_stuff(i); i++;
do_stuff(i); i++;
do_stuff(i); i++;
do_stuff(i); i++;
do_stuff(i); i++;
do_stuff(i); i++;
do_stuff(i); i++;
do_stuff(i); i++;
do_stuff(i); i++;
}
可以看出,新代码里比较指令由100次降低为10次,循环时间节约了90%。不过注意: 对于中间变量或结果被更改的循环,编译程序往往拒绝展开,这时候就需要你自己来做展开工作了。
还有一点需要注意,在有内部指令cache的CPU上(如MMX芯片),因为循环展开的代码很大,往往会导致cache溢出,这时展开的代码会频繁地在CPU 的cache和内存之间调来调去,又因为cache速度很高,所以此时循环展开反而会变慢。还有就是循环展开会影响矢量运算优化。
相同循环条件的嵌套起来
把相关循环放到一个循环里,也会加快速度。
旧代码:
for (i = 0; i < MAX; i++) /* initialize 2d array to 0's */
for (j = 0; j < MAX; j++)
a[i][j] = 0.0;
for (i = 0; i < MAX; i++) /* put 1's along the diagonal */
a[i][i] = 1.0;
新代码:
for (i = 0; i < MAX; i++) /* initialize 2d array to 0's */
{
for (j = 0; j < MAX; j++)
a[i][j] = 0.0;
a[i][i] = 1.0; /* put 1's along the diagonal */
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
cpu
+关注
关注
68文章
11378浏览量
226493 -
C语言
+关注
关注
183文章
7650浏览量
146466 -
代码
+关注
关注
30文章
4985浏览量
74577
发布评论请先 登录
相关推荐
热点推荐
C语言中for循环的用法和应用 C语言中for循环与while循环的区别
C语言中的循环结构时,for循环是最常用的一种。它允许重复执行一段代码,直到满足特定条件为止。
发表于 08-18 16:33
•4568次阅读
c语言中顺序结构的基本流程
的语句组成,这些语句用于完成特定的任务或操作。在C语言中,每个语句都以分号结束,多个语句可以用大括号括起来形成一个语句块。在顺序结构中,每个语句都依次执行,按照代码的顺序
c语言中逻辑真等价于什么
语言中,条件表达式的结果只能是真(非零)或假(零)。如果条件满足,即条件结果为真,则可以执行相应的代码块或完成特定的操作。相反,如果条件不满足,则执行其他
C语言中如何优化代码的执行效率
评论