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)做展開 這是經(jīng)典的速度優(yōu)化,但許多編譯程序(如gcc -funroll-loops)能自動(dòng)完成這個(gè)事,所以現(xiàn)在你自己來優(yōu)化這個(gè)顯得效果不明顯。 舊代碼: for (i = 0 ; i 10" />
0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語言中如何優(yōu)化代碼的執(zhí)行效率

麥辣雞腿堡 ? 來源:軒哥談芯 ? 作者:Debug ? 2023-11-20 18:09 ? 次閱讀

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)做展開

這是經(jīng)典的速度優(yōu)化,但許多編譯程序(如gcc -funroll-loops)能自動(dòng)完成這個(gè)事,所以現(xiàn)在你自己來優(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%。不過注意: 對(duì)于中間變量或結(jié)果被更改的循環(huán),編譯程序往往拒絕展開,這時(shí)候就需要你自己來做展開工作了。

還有一點(diǎn)需要注意,在有內(nèi)部指令cache的CPU上(如MMX芯片),因?yàn)檠h(huán)展開的代碼很大,往往會(huì)導(dǎo)致cache溢出,這時(shí)展開的代碼會(huì)頻繁地在CPU 的cache和內(nèi)存之間調(diào)來調(diào)去,又因?yàn)閏ache速度很高,所以此時(shí)循環(huán)展開反而會(huì)變慢。還有就是循環(huán)展開會(huì)影響矢量運(yùn)算優(yōu)化。

相同循環(huán)條件的嵌套起來

把相關(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 */
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10698

    瀏覽量

    209330
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7575

    瀏覽量

    134027
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4670

    瀏覽量

    67764
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語言中宏定義的應(yīng)用

    C語言中,宏定義是一種預(yù)處理指令,用于在代碼中定義和使用常量、函數(shù)或代碼片段的替代。
    發(fā)表于 08-17 15:33 ?612次閱讀

    C語言中for循環(huán)的用法和應(yīng)用 C語言中for循環(huán)與while循環(huán)的區(qū)別

    C語言中的循環(huán)結(jié)構(gòu)時(shí),for循環(huán)是最常用的一種。它允許重復(fù)執(zhí)行一段代碼,直到滿足特定條件為止。
    發(fā)表于 08-18 16:33 ?2470次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言中</b>for循環(huán)的用法和應(yīng)用 <b class='flag-5'>C</b><b class='flag-5'>語言中</b>for循環(huán)與while循環(huán)的區(qū)別

    編程語言中一個(gè)奇怪的代碼結(jié)構(gòu)

    C語言C++等編程語言中,我們常常會(huì)遇到一個(gè)奇怪的代碼結(jié)構(gòu)。
    發(fā)表于 11-01 10:24 ?314次閱讀
    編程<b class='flag-5'>語言中</b>一個(gè)奇怪的<b class='flag-5'>代碼</b>結(jié)構(gòu)

    C語言優(yōu)化小技巧

    在編寫C語言程序后,經(jīng)常需要對(duì)源碼進(jìn)行優(yōu)化,以提高程序的運(yùn)行效率,下面簡(jiǎn)述幾個(gè)常用的優(yōu)化技巧以供大家參考:1.
    發(fā)表于 04-24 14:13

    C語言優(yōu)化小技巧

    `在編寫C語言程序后,經(jīng)常需要對(duì)源碼進(jìn)行優(yōu)化,以提高程序的運(yùn)行效率,下面簡(jiǎn)述幾個(gè)常用的優(yōu)化技巧以供大家參考:1.
    發(fā)表于 04-11 15:08

    C語言優(yōu)化小技巧

    在編寫C語言程序后,經(jīng)常需要對(duì)源碼進(jìn)行優(yōu)化,以提高程序的運(yùn)行效率,下面簡(jiǎn)述幾個(gè)常用的優(yōu)化技巧以供大家參考:1.
    發(fā)表于 09-23 14:10

    C語言優(yōu)化小技巧

    C語言優(yōu)化小技巧在編寫C語言程序后,經(jīng)常需要對(duì)源碼進(jìn)行優(yōu)化,以提高程序的運(yùn)行
    發(fā)表于 10-13 14:34

    請(qǐng)問C語言中ASCII代碼是什么意思?

    C語言中ASCII代碼是什么意思常見的ASCII代碼都需要記嗎
    發(fā)表于 04-28 07:35

    C語言中的宏是什么

    第五章 性能優(yōu)化5.1 使用宏定義  在C語言中,宏是產(chǎn)生內(nèi)嵌代碼的唯一方法。對(duì)于嵌入式系統(tǒng)而言,為了能達(dá)到性能要求,宏是一種很好的代替函數(shù)的方法?! 懸粋€(gè)"標(biāo)準(zhǔn)"宏MIN ,這個(gè)宏
    發(fā)表于 12-15 08:20

    C語言中ASCII代碼是什么意思?

    C語言中ASCII代碼是什么意思常見的ASCII代碼都需要記嗎
    發(fā)表于 10-25 07:10

    C語言中隨機(jī)數(shù)的生成代碼

    C語言中隨機(jī)數(shù)的生成完整代碼
    的頭像 發(fā)表于 02-20 09:21 ?1w次閱讀

    C語言高效編程與代碼優(yōu)化

    翻譯作者:碼農(nóng)網(wǎng) gunner 在本篇文章中,我收集了很多經(jīng)驗(yàn)和方法。應(yīng)用這些經(jīng)驗(yàn)和方法,可以幫助我們從執(zhí)行速度和內(nèi)存使用等方面來優(yōu)化C語言代碼
    的頭像 發(fā)表于 10-19 17:04 ?1598次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>高效編程與<b class='flag-5'>代碼</b><b class='flag-5'>優(yōu)化</b>

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

    在標(biāo)準(zhǔn)C語言中,編譯出來的可執(zhí)行程序分為代碼區(qū)(text)、數(shù)據(jù)區(qū)(data)和未初始化數(shù)據(jù)區(qū)(bss)3個(gè)部分。如下代碼
    的頭像 發(fā)表于 06-16 09:01 ?1757次閱讀
    在標(biāo)準(zhǔn)<b class='flag-5'>C</b><b class='flag-5'>語言中</b>編譯出來的可<b class='flag-5'>執(zhí)行</b>程序

    c語言中順序結(jié)構(gòu)的基本流程

    的語句組成,這些語句用于完成特定的任務(wù)或操作。在C語言中,每個(gè)語句都以分號(hào)結(jié)束,多個(gè)語句可以用大括號(hào)括起來形成一個(gè)語句塊。在順序結(jié)構(gòu)中,每個(gè)語句都依次執(zhí)行,按照代碼的順序
    的頭像 發(fā)表于 11-22 10:20 ?779次閱讀

    c語言中邏輯真等價(jià)于什么

    語言中,條件表達(dá)式的結(jié)果只能是真(非零)或假(零)。如果條件滿足,即條件結(jié)果為真,則可以執(zhí)行相應(yīng)的代碼塊或完成特定的操作。相反,如果條件不滿足,則執(zhí)行其他
    的頭像 發(fā)表于 11-30 14:10 ?1461次閱讀