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文章
11029瀏覽量
215862 -
C語言
+關注
關注
180文章
7629瀏覽量
140160 -
代碼
+關注
關注
30文章
4886瀏覽量
70216
發布評論請先 登錄
C語言中for循環的用法和應用 C語言中for循環與while循環的區別

評論