中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

你會(huì)為了性能而犧牲代碼簡(jiǎn)潔性嗎?

2018-07-20    來(lái)源:編程學(xué)習(xí)網(wǎng)

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

  原文作者Arne Mertz是一位C++狂熱份子,有著豐富的開(kāi)發(fā)經(jīng)驗(yàn)。文中Arne Mertz針對(duì)簡(jiǎn)潔和性能的關(guān)系進(jìn)行闡述,他認(rèn)為,開(kāi)發(fā)者不到萬(wàn)不得已時(shí)千萬(wàn)不要為了性能而犧牲簡(jiǎn)潔性,要學(xué)會(huì)使用工具來(lái)解決性能問(wèn)題。

  譯文如下:

  C++的強(qiáng)項(xiàng)之一是能寫出非常高性能的代碼。那么在實(shí)際中,我們?cè)撊绾伟盐蘸眯阅芴幚淼某叨饶兀?/span>

  性能≠效率

  首先要明確的一點(diǎn)是我們必須把性能和效率區(qū)分清楚。這兩者分別代表什么?

  • 我們能做得多快(性能);
  • 它需要多長(zhǎng)時(shí)間去完成(效率)。

  這看上去好像差不多,但其實(shí)不是。舉個(gè)例子,假設(shè)你需要從A點(diǎn)到B點(diǎn),效率意味著“最短路徑”,性能意味著“以跑代走”。因此,即使以博爾特的速度到達(dá)終點(diǎn),雖然高性能,但并不高效—“沒(méi)有選擇最短路徑”。

  對(duì)于程序來(lái)說(shuō),循環(huán)通常會(huì)耗費(fèi)不少時(shí)間。這種情況下,性能意味著“單個(gè)循環(huán)用時(shí)越短越好”,效率意味著“盡量降低循環(huán)層數(shù)”。

  性能并非程序的全部

  這是很淺顯的道理,但往往容易被忽視,特別是程序員新手。在不少編程論壇里,涉及代碼性能優(yōu)化的提問(wèn)比比皆是。

  有個(gè)說(shuō)法是80%的程序運(yùn)行時(shí)間是由約20%代碼決定的,還有的說(shuō)是90%/10%。因此,對(duì)于程序來(lái)說(shuō),關(guān)鍵運(yùn)算代碼可能僅存在于某小部分代碼中。所以,如果把精力放在所有代碼的優(yōu)化上,而不重點(diǎn)主攻關(guān)鍵代碼,其實(shí)是事倍功半的。

  我們真的不懂如何寫高性能的代碼?

  事實(shí)上,決定程序運(yùn)行時(shí)長(zhǎng)主要的因素是指令數(shù)的多少,但這不是由我們控制而是由編譯器及其優(yōu)化器所控制的。

  優(yōu)化器種類繁多,除非是該領(lǐng)域的專家,否則很難明白它對(duì)代碼做了哪些優(yōu)化工作。優(yōu)化器可以銷毀臨時(shí)對(duì)象,可以內(nèi)聯(lián)函數(shù),可以清除更多其它指令。

  所以當(dāng)這些不確定因素存在時(shí),我們還能寫出絕對(duì)高性能代碼嗎?如果真的很在意性能,我建議使用工具來(lái)輔助完成。

  但也不必太悲觀。如果有兩種或更多的方法來(lái)寫出同樣可讀的代碼,那么不妨選擇最高性能的寫法。例如,在不存儲(chǔ)結(jié)果的情況下,可以使用++iter來(lái)代替iter++。

  性能和簡(jiǎn)單并不總是矛盾

  影響程序運(yùn)行時(shí)間的另一個(gè)重要因素是內(nèi)存中數(shù)據(jù)的布局和結(jié)構(gòu)。詳細(xì)請(qǐng)參考Chandler Carruth的文章Efficiency with Algorithms, Performance with Data Structures。

  補(bǔ)充一點(diǎn),假如數(shù)據(jù)的內(nèi)存布局不優(yōu)良,那么會(huì)造成要花費(fèi)很多時(shí)間來(lái)從獲取數(shù)據(jù),同時(shí)會(huì)造成指令冗余。

  對(duì)于簡(jiǎn)潔和性能的關(guān)系,還可以參考文章Using the libraries you have, and using them right。

  小結(jié)

  建議默認(rèn)編寫出可讀和簡(jiǎn)單的代碼。如果你真的發(fā)現(xiàn)存在性能問(wèn)題并已經(jīng)找出其位置,那么仍然有很多選擇來(lái)對(duì)此進(jìn)行處理而不必為了追求快而寫出復(fù)雜的代碼。不到萬(wàn)不得已不要為了性能而犧牲簡(jiǎn)潔性,同時(shí)要學(xué)會(huì)使用工具來(lái)解決性能問(wèn)題。

  那么問(wèn)題來(lái)了,你會(huì)為了性能而犧牲代碼簡(jiǎn)潔性嗎?

  英文出自:arne-mertz.de

標(biāo)簽: 代碼 開(kāi)發(fā)者

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:C語(yǔ)言雜談:指針與數(shù)組(下)

下一篇:C語(yǔ)言雜談:指針與數(shù)組 (上)