0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

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

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

C語言中如何使用查表提速

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

使用查表提速

一個(gè)資深的C語言程序員,基本上不會(huì)在自己的主循環(huán)里搞什么復(fù)雜的運(yùn)算工作,絕對(duì)都是先計(jì)算好了,再到循環(huán)里查表??聪旅娴睦樱?/p>

舊代碼:

long factorial(int i)
{
    if (i == 0)
      return 1;
    else
      return i * factorial(i - 1);
}

查表法新代碼:

static long factorial_table[] = {1, 1, 2, 624, 120, 720  /* etc */ };
long factorial(int i)
{
    return factorial_table[i];
}

如果需要建立的表很大,那么可以通過一個(gè)初始化函數(shù),在循環(huán)外臨時(shí)生成表格。

看一個(gè)求余運(yùn)算

a=a%8;

如果改為:

a=a&7;

就會(huì)執(zhí)行速度變快,因?yàn)樵?a target="_blank">處理器中,位操作只需一個(gè)指令周期即可完成,而大部分的C編譯器的“%”運(yùn)算均是調(diào)用子程序來完成,代碼長(zhǎng)、執(zhí)行速度慢。通常,只要求是求2n方的余數(shù),均可使用位操作的方法來代替。

求平方運(yùn)算

一些偏軟件的工程師往往會(huì)寫成這樣:

a=pow(a, 2.0);

也許這樣兼容性更好,可以處理的數(shù)據(jù)類型更多,但對(duì)于嵌入式來說,效率更為重要。

軒哥曾經(jīng)排查過一個(gè)代碼就是如此,這里的pow()函數(shù)執(zhí)行速度慢不說,調(diào)用這個(gè)函數(shù)將會(huì)產(chǎn)生2K多的代碼,直接導(dǎo)致Flash所剩無幾。

對(duì)于定點(diǎn)運(yùn)算,可以改為:

a=a*a;

在有內(nèi)置硬件乘法器的單片機(jī)中(如STM32),乘法運(yùn)算比求平方運(yùn)算快得多,因?yàn)楦↑c(diǎn)數(shù)的求平方是通過調(diào)用子程序來實(shí)現(xiàn)的,而自帶硬件乘法器的單片機(jī)中,乘法運(yùn)算只需2個(gè)時(shí)鐘周期就可以完成。即使是在沒有內(nèi)置硬件乘法器的單片機(jī)中,乘法運(yùn)算的子程序也要比平方運(yùn)算的子程序代碼短,執(zhí)行速度快。

如果是求3次方,如:

a=pow(a,3.0);

更改為:

a=a*a*a;

效率的提升會(huì)非常明顯。

聲明:本文內(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)投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7581

    瀏覽量

    135547
  • 程序
    +關(guān)注

    關(guān)注

    115

    文章

    3743

    瀏覽量

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

    關(guān)注

    30

    文章

    4694

    瀏覽量

    68078
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    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 ?2765次閱讀
    <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ū)別

    C語言中基本數(shù)據(jù)類型、變量和常量的使用

    C語言中基本數(shù)據(jù)類型、變量和常量的使用
    發(fā)表于 08-18 16:42 ?2207次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言中</b>基本數(shù)據(jù)類型、變量和常量的使用

    C語言中結(jié)構(gòu)體能不能相加

    C語言中,結(jié)構(gòu)體能不能相加?
    的頭像 發(fā)表于 12-19 17:04 ?1134次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言中</b>結(jié)構(gòu)體能不能相加

    C語言中的坑有哪些?

    總結(jié)幾個(gè)C語言中的“坑”
    發(fā)表于 12-28 06:11

    C語言中指針的介紹非常詳細(xì)

    C語言中指針的介紹非常詳細(xì) C語言中指針的介紹非常詳細(xì)
    發(fā)表于 12-25 10:39 ?57次下載

    C語言和匯編語言混合編程方法和C語言中斷處理方法

    C語言和匯編語言混合編程方法和C語言中斷處理方法,new
    發(fā)表于 01-06 14:36 ?36次下載

    C語言中的關(guān)鍵字

    C語言中的入門教程
    發(fā)表于 10-14 16:24 ?3次下載

    c語言中typedef的用法

    C語言是一門通用計(jì)算機(jī)編程語言,應(yīng)用廣泛。C語言的設(shè)計(jì)目標(biāo)是提供一種能以簡(jiǎn)易的方式編譯、處理低級(jí)存儲(chǔ)器、產(chǎn)生少量的機(jī)器碼以及不需要任何運(yùn)行環(huán)
    發(fā)表于 11-09 15:23 ?9151次閱讀

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

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

    總結(jié)那么幾個(gè)C語言中的“坑”

    總結(jié)幾個(gè)C語言中的“坑”
    的頭像 發(fā)表于 01-16 10:52 ?2517次閱讀

    C語言應(yīng)用】使用查表法計(jì)算CRC8

    C語言應(yīng)用】使用查表法計(jì)算CRC8
    的頭像 發(fā)表于 08-31 12:54 ?9642次閱讀

    c#語言中怎么使用HTTP代理

    c#語言中怎么使用HTTP代理。
    的頭像 發(fā)表于 09-01 14:46 ?2065次閱讀

    scanf在C語言中的作用

    scanf在C語言中的作用? scanf是C語言中的輸入函數(shù),用于從標(biāo)準(zhǔn)輸入設(shè)備(如鍵盤)讀取數(shù)據(jù),并將其存儲(chǔ)到變量中。它是C
    的頭像 發(fā)表于 11-23 14:13 ?1146次閱讀

    c語言中數(shù)組怎么定義

    C語言中,數(shù)組是一種用來存儲(chǔ)相同類型元素的數(shù)據(jù)結(jié)構(gòu)。它可以存儲(chǔ)多個(gè)元素,并通過一個(gè)共同的名稱來引用這些元素。數(shù)組是一種很重要的數(shù)據(jù)結(jié)構(gòu),可以用于解決很多實(shí)際的問題。 在C語言中,定義數(shù)
    的頭像 發(fā)表于 11-24 10:11 ?2554次閱讀