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 */
}
全部0条评论
快来发表一下你的评论吧 !