while 和 do ...while
用while循環(huán)時有以下兩種循環(huán)形式:
unsigned int i;
i=0;
while (i< 1000)
{
i++;
//用戶程序
}
或:
unsigned int i;
i=1000;
do
{
i--;
//用戶程序
}
while (i >0);
在這兩種循環(huán)中,使用do…while循環(huán)編譯后生成的代碼的長度短于while循環(huán),而且do...while循環(huán)大多數(shù)時候更可靠,具備更好的容錯性。
適當(dāng)?shù)膶ρh(huán)做展開
這是經(jīng)典的速度優(yōu)化,但許多編譯程序(如gcc -funroll-loops)能自動完成這個事,所以現(xiàn)在你自己來優(yōu)化這個顯得效果不明顯。
舊代碼:
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次,循環(huán)時間節(jié)約了90%。不過注意: 對于中間變量或結(jié)果被更改的循環(huán),編譯程序往往拒絕展開,這時候就需要你自己來做展開工作了。
還有一點(diǎn)需要注意,在有內(nèi)部指令cache的CPU上(如MMX芯片),因?yàn)檠h(huán)展開的代碼很大,往往會導(dǎo)致cache溢出,這時展開的代碼會頻繁地在CPU 的cache和內(nèi)存之間調(diào)來調(diào)去,又因?yàn)閏ache速度很高,所以此時循環(huán)展開反而會變慢。還有就是循環(huán)展開會影響矢量運(yùn)算優(yōu)化。
相同循環(huán)條件的嵌套起來
把相關(guān)循環(huán)放到一個循環(huán)里,也會加快速度。
舊代碼:
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
+關(guān)注
關(guān)注
68文章
11029瀏覽量
215867 -
C語言
+關(guān)注
關(guān)注
180文章
7630瀏覽量
140162 -
代碼
+關(guān)注
關(guān)注
30文章
4886瀏覽量
70216
發(fā)布評論請先 登錄
C語言中for循環(huán)的用法和應(yīng)用 C語言中for循環(huán)與while循環(huán)的區(qū)別

C語言優(yōu)化小技巧
C語言優(yōu)化小技巧
C語言優(yōu)化小技巧
C語言中斷言如何去使用
C語言中的宏是什么
C語言高效編程與代碼優(yōu)化

在標(biāo)準(zhǔn)C語言中編譯出來的可執(zhí)行程序

評論