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

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

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

C語(yǔ)言中如何使用查表提速

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

使用查表提速

一個(gè)資深的C語(yǔ)言程序員,基本上不會(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, 6, 24, 120, 720  /* etc */ };
long factorial(int i)
{
    return factorial_table[i];
}

如果需要建立的表很大,那么可以通過(guò)一個(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)用子程序來(lái)完成,代碼長(zhǎng)、執(zhí)行速度慢。通常,只要求是求2n方的余數(shù),均可使用位操作的方法來(lái)代替。

求平方運(yùn)算

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

a=pow(a, 2.0);

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

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

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

a=a*a;

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

如果是求3次方,如:

a=pow(a,3.0);

更改為:

a=a*a*a;

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

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

    關(guān)注

    180

    文章

    7614

    瀏覽量

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

    關(guān)注

    117

    文章

    3793

    瀏覽量

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

    關(guān)注

    30

    文章

    4809

    瀏覽量

    68816
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

    C語(yǔ)言中的循環(huán)結(jié)構(gòu)時(shí),for循環(huán)是最常用的一種。它允許重復(fù)執(zhí)行一段代碼,直到滿足特定條件為止。
    發(fā)表于 08-18 16:33 ?3337次閱讀
    <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ū)別

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

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

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

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

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

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

    C語(yǔ)言和匯編語(yǔ)言混合編程方法和C語(yǔ)言中斷處理方法

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

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

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

    c語(yǔ)言中typedef的用法

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

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

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

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

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

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

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

    c#語(yǔ)言中怎么使用HTTP代理

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

    scanf在C語(yǔ)言中的作用

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

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

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

    C語(yǔ)言中的socket編程基礎(chǔ)

    Socket編程簡(jiǎn)介 Socket是一種通信機(jī)制,允許程序之間進(jìn)行通信。在C語(yǔ)言中,socket編程是網(wǎng)絡(luò)編程的基礎(chǔ)。通過(guò)使用socket,程序可以發(fā)送和接收數(shù)據(jù),實(shí)現(xiàn)不同計(jì)算機(jī)之間的通信
    的頭像 發(fā)表于 11-01 16:51 ?389次閱讀