代碼優(yōu)化

優(yōu)化追求

  • 優(yōu)化主要是內(nèi)存使用與執(zhí)行速度的雙優(yōu)化

  • 需根據(jù)硬件條件料饥、輸入作用域蒲犬、精度、優(yōu)化的時(shí)間和精力消耗岸啡、代碼可讀性原叮、程序復(fù)雜度等全面評(píng)估。

優(yōu)化總思路

方法

  • 找出程序中執(zhí)行緩慢或占用內(nèi)存較大的地方進(jìn)行優(yōu)化——程序內(nèi)部循環(huán)重復(fù)調(diào)用、調(diào)用第三方庫(kù)最該被優(yōu)化奋隶;

途徑

  • 經(jīng)驗(yàn)查找擂送;

  • Visual C++ 內(nèi)置的性能工具 profiler 來(lái)找出程序中消耗最多內(nèi)存的地方;

  • 英特爾的 Vtune唯欣,它也能很好的檢測(cè)出程序中運(yùn)行最慢的部分嘹吨;

優(yōu)化123

整形數(shù)

  • 盡量使用整形代替浮點(diǎn)型(避免浮點(diǎn)運(yùn)行單元或浮點(diǎn)庫(kù)的調(diào)用),如浮點(diǎn)型只需兩位小數(shù)境氢,可以乘100變成int;

  • 盡量使用unsigned int,如果符號(hào)已知蟀拷;

浮點(diǎn)數(shù)

  • 嘗試定點(diǎn)數(shù)代替浮點(diǎn)數(shù);

  • 浮點(diǎn)數(shù)盡量用float代替double;

先驗(yàn)函數(shù)

sin萍聊、exp问芬、sqrt 和 log 是通過(guò)一系列的乘法和加法實(shí)現(xiàn)的(使用了精度擴(kuò)展)。這些操作比通常的乘法至少慢十倍寿桨。

  • 泰勒級(jí)數(shù)展開(kāi);

  • 多項(xiàng)函數(shù)近似:

除法和取余

  • 除法盡量換成乘法此衅;

  • 除法或取余可以循環(huán)減代替;

  • 用移位代替除法(除數(shù)是2的冪次)亭螟;

  • 多個(gè)除法時(shí)炕柔,合并除法;

  • 查表(更快媒佣,更能節(jié)省存儲(chǔ)空間)或近似替代代替除法;

  • 使用常量將除法轉(zhuǎn)換為乘法陵刹,如x=x/3.0 可以替換為x=x*(1.0/3.0);

  • 判斷句中除法換成邏輯關(guān)系和乘法比較形式默伍;

  • 盡量使除數(shù)和被除數(shù)是無(wú)符號(hào)的整數(shù)(除法效率:整形>浮點(diǎn)型;無(wú)符號(hào)>有符號(hào))衰琐;

變量生命周期

由于處理器中寄存器是固定長(zhǎng)度的也糊,程序中數(shù)字型變量在寄存器中的存儲(chǔ)是有一定限制的。

  • 限定變量的使用數(shù)量:將較大的函數(shù)拆分為小而簡(jiǎn)單的函數(shù)也會(huì)達(dá)到很好的效果羡宙;

  • 對(duì)經(jīng)常使用到的變量采用寄存器存儲(chǔ)狸剃。

局部變量

  • 盡可能的不使用 char 和 short 類型的局部變量,使用int或unsigned int代替(避免編譯器賦值時(shí)兩次的移位操作)

指針

  • 盡可能的使用引用或指針的方式傳遞結(jié)構(gòu)數(shù)據(jù)狗热,否則傳遞的數(shù)據(jù)會(huì)被拷貝到棧中钞馁,從而降低程序的性能;

  • 確定不改變數(shù)據(jù)結(jié)構(gòu)的值時(shí)匿刮,設(shè)置為const pointer;

  • 盡量避免重復(fù)的指針鏈僧凰,如緩存指針鏈為局部變量:Point3 *pos = p->pos;

布爾表達(dá)式判斷范圍

  • x>min && x<max可以轉(zhuǎn)換為 (unsigned)(x-min)<(max-min)(如為負(fù),換成無(wú)符號(hào)就肯定符合)熟丸;

  • 盡量使用與0判斷的形式训措,優(yōu)化C編譯器內(nèi)部的比較指令;

條件語(yǔ)句

  • 如果可以,用switch語(yǔ)句代替if-else語(yǔ)句绩鸣,避免最后條件滿足時(shí)else前面條件都運(yùn)行怀大;

  • if條件內(nèi)如果是&&||,則應(yīng)將容易判斷的條件放在前面,這樣后面條件有時(shí)可以避免判斷呀闻;

  • switch-case中case過(guò)多時(shí)化借,可以使用數(shù)組、映射等方法優(yōu)化总珠;

循環(huán)

  • 使用計(jì)數(shù)到零的循環(huán)(遞減形式到0屏鳍,用0做判斷)和簡(jiǎn)單的循環(huán)終止條件;

  • 如果可以局服,合并循環(huán)钓瞭;

  • 循環(huán)中,總是調(diào)用函數(shù)淫奔,則將循環(huán)納入到函數(shù)(調(diào)用函數(shù)時(shí)總是會(huì)有一定的性能消耗)山涡;

  • 展開(kāi)循環(huán)

    • 循環(huán)迭代次數(shù)只有幾次,那么可以完全唆迁,以便消除循壞帶來(lái)的負(fù)擔(dān)鸭丛;

    • 大的循環(huán)可以分解間斷著展開(kāi),然后大步循環(huán)唐责,減小循環(huán)次數(shù)鳞溉;

    • 盡早的斷開(kāi)循環(huán),增加break環(huán)節(jié)鼠哥;

函數(shù)設(shè)計(jì)

  • 盡量保證函數(shù)使用少于四個(gè)參數(shù)熟菲。這樣就不會(huì)使用棧來(lái)存儲(chǔ)參數(shù)值;

  • 將參數(shù)放入一個(gè)結(jié)構(gòu)體并通過(guò)指針傳入函數(shù)朴恳,這樣可以減少參數(shù)的數(shù)量并提高可讀性抄罕;

  • 減少全局變量的使用,使用 static 修飾變量為文件內(nèi)訪問(wèn)于颖;

  • 盡量使用整形兼容類型(char呆贿,shorts,ints 和 floats 都占用一個(gè)字)森渐;

  • 多使用葉子函數(shù)(內(nèi)部不調(diào)用其他函數(shù)的函數(shù))做入,消耗小,高效章母;

    • 避免調(diào)用其他函數(shù):包括那些轉(zhuǎn)而調(diào)用 C 庫(kù)的函數(shù)(比如除法或者浮點(diǎn)操作函數(shù))母蛛;

    • 簡(jiǎn)短的函數(shù)使用__inline 修飾(調(diào)用處直接替換為函數(shù)體。代碼調(diào)用函數(shù)更快乳怎,但增加代碼的大小彩郊,特別在函數(shù)本身比較大而且經(jīng)常調(diào)用的情況下)前弯;

    • 使用 #define 宏取代常用的小函數(shù);

  • 不使用遞歸(需要太多的函數(shù)調(diào)用);

  • 一維數(shù)組比多維數(shù)組更快;

  • 加法操作比乘法快,乘法比除法快秫逝;

  • 如果你的庫(kù)支持 mallopt () 函數(shù)(用于控制 malloc)恕出,盡量使用它。MAXFAST 的設(shè)置违帆,對(duì)于調(diào)用很多次 malloc 工作的函數(shù)由很大的性能提升浙巫;

  • 將編譯器優(yōu)化選項(xiàng)打開(kāi)!K⒑蟆的畴!


參考文獻(xiàn)

代碼優(yōu)化-之-優(yōu)化除法

三角函數(shù)逼近快速算法(正余弦)

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市尝胆,隨后出現(xiàn)的幾起案子丧裁,更是在濱河造成了極大的恐慌,老刑警劉巖含衔,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件煎娇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡贪染,警方通過(guò)查閱死者的電腦和手機(jī)缓呛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)杭隙,“玉大人哟绊,你說(shuō)我怎么就攤上這事√翟鳎” “怎么了匿情?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)信殊。 經(jīng)常有香客問(wèn)我,道長(zhǎng)汁果,這世上最難降的妖魔是什么涡拘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮据德,結(jié)果婚禮上鳄乏,老公的妹妹穿的比我還像新娘。我一直安慰自己棘利,他們只是感情好橱野,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著善玫,像睡著了一般水援。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天蜗元,我揣著相機(jī)與錄音或渤,去河邊找鬼。 笑死奕扣,一個(gè)胖子當(dāng)著我的面吹牛薪鹦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惯豆,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼池磁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了楷兽?” 一聲冷哼從身側(cè)響起地熄,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拄养,沒(méi)想到半個(gè)月后离斩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瘪匿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年跛梗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棋弥。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡核偿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出顽染,到底是詐尸還是另有隱情漾岳,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布粉寞,位于F島的核電站尼荆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏唧垦。R本人自食惡果不足惜捅儒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望振亮。 院中可真熱鬧巧还,春花似錦、人聲如沸坊秸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)褒搔。三九已至阶牍,卻和暖如春喷面,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背荸恕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工乖酬, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人融求。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓咬像,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親生宛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子县昂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 優(yōu)化追求 優(yōu)化主要是內(nèi)存使用與執(zhí)行速度的雙優(yōu)化。 需根據(jù)硬件條件陷舅、輸入作用域倒彰、精度、優(yōu)化的時(shí)間和精力消耗莱睁、代碼可讀...
    froginhot閱讀 1,141評(píng)論 0 1
  • 最近有點(diǎn)想法要優(yōu)化重構(gòu)之前的工程待讳,這是一個(gè)漫長(zhǎng)的過(guò)程,既然重構(gòu)那就要好改一改以前剛學(xué)的時(shí)候各種小毛病仰剿〈吹看到別人推薦...
    游泳的星塵龍閱讀 722評(píng)論 0 48
  • 雖然現(xiàn)在寫(xiě)作文對(duì)我來(lái)說(shuō)不算難事,可是要每天都寫(xiě)一篇南吮,還要有理有據(jù)琳彩,這就比較難了。因?yàn)槲业纳畈凰阖S富多彩部凑,不像別人...
    路語(yǔ)旁集閱讀 191評(píng)論 0 0
  • 每個(gè)人都有自己要走的路涂邀、想走的路瘟仿、走過(guò)的路和未走的路,而電影是我們生活中“走過(guò)”的另一條路比勉。 以上電影排序猾骡,為排版...
    榕樹(shù)下的娃兒閱讀 321評(píng)論 0 1
  • 2018 年《財(cái)富》世界 500 強(qiáng)排行榜中,豐田汽車名列總體排名第 6 位敷搪、全球汽車行業(yè)排名第一、日本企業(yè)排名第...
    會(huì)議專家全時(shí)閱讀 530評(píng)論 0 0