while 和 do ...while
用while循環(huán)時(shí)有以下兩種循環(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)編譯后生成的代碼的長(zhǎng)度短于while循環(huán),而且do...while循環(huán)大多數(shù)時(shí)候更可靠,具備更好的容錯(cuò)性。
適當(dāng)?shù)膶?duì)循環(huán)做展開(kāi)
這是經(jīng)典的速度優(yōu)化,但許多編譯程序(如gcc -funroll-loops)能自動(dòng)完成這個(gè)事,所以現(xiàn)在你自己來(lái)優(yōu)化這個(gè)顯得效果不明顯。
舊代碼:
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)時(shí)間節(jié)約了90%。不過(guò)注意: 對(duì)于中間變量或結(jié)果被更改的循環(huán),編譯程序往往拒絕展開(kāi),這時(shí)候就需要你自己來(lái)做展開(kāi)工作了。
還有一點(diǎn)需要注意,在有內(nèi)部指令cache的CPU上(如MMX芯片),因?yàn)檠h(huán)展開(kāi)的代碼很大,往往會(huì)導(dǎo)致cache溢出,這時(shí)展開(kāi)的代碼會(huì)頻繁地在CPU 的cache和內(nèi)存之間調(diào)來(lái)調(diào)去,又因?yàn)閏ache速度很高,所以此時(shí)循環(huán)展開(kāi)反而會(huì)變慢。還有就是循環(huán)展開(kāi)會(huì)影響矢量運(yùn)算優(yōu)化。
相同循環(huán)條件的嵌套起來(lái)
把相關(guān)循環(huán)放到一個(gè)循環(huán)里,也會(huì)加快速度。
舊代碼:
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文章
10905瀏覽量
213034 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7614瀏覽量
137739 -
代碼
+關(guān)注
關(guān)注
30文章
4828瀏覽量
69063
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
C語(yǔ)言中宏定義的應(yīng)用
C語(yǔ)言中for循環(huán)的用法和應(yīng)用 C語(yǔ)言中for循環(huán)與while循環(huán)的區(qū)別
![<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言中</b>for循環(huán)的用法和應(yīng)用 <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言中</b>for循環(huán)與while循環(huán)的區(qū)別](https://file1.elecfans.com/web2/M00/91/51/wKgaomTfLICAFadXAAAF1QHPifc502.jpg)
編程語(yǔ)言中一個(gè)奇怪的代碼結(jié)構(gòu)
![編程<b class='flag-5'>語(yǔ)言中</b>一個(gè)奇怪的<b class='flag-5'>代碼</b>結(jié)構(gòu)](https://file1.elecfans.com/web2/M00/AD/89/wKgZomVBtzWAKdoYAABYzrQ4IPk981.jpg)
C語(yǔ)言優(yōu)化小技巧
C語(yǔ)言優(yōu)化小技巧
C語(yǔ)言優(yōu)化小技巧
C語(yǔ)言優(yōu)化小技巧
C語(yǔ)言中斷言如何去使用
C語(yǔ)言中的宏是什么
C語(yǔ)言高效編程與代碼優(yōu)化
![<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>高效編程與<b class='flag-5'>代碼</b><b class='flag-5'>優(yōu)化</b>](https://file.elecfans.com/web1/M00/CA/4C/o4YBAF-NVsKAYOGmAAG-7SxFVHY510.png)
在標(biāo)準(zhǔn)C語(yǔ)言中編譯出來(lái)的可執(zhí)行程序
![在標(biāo)準(zhǔn)<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言中</b>編譯出來(lái)的可<b class='flag-5'>執(zhí)行</b>程序](https://file.elecfans.com//web2/M00/4B/BD/pYYBAGKqgOmARk-SAAFxhFyS5SM314.png)
評(píng)論