C++ 服務(wù)端 性能優(yōu)化入門

編寫正常運(yùn)行的程序很容易冰评,但一旦數(shù)據(jù)量大起來,對代碼的性能就需要認(rèn)真考慮了木羹。對于服務(wù)器來說甲雅,如果客戶端一次訪問,就需要話費(fèi)幾百毫秒坑填,那么一旦每秒的訪問次數(shù)多起來抛人,后續(xù)的請求就會(huì)造成很明顯的延遲。嚴(yán)重影響用戶體驗(yàn)脐瑰。最近做后端服務(wù)也遇到了一些需要優(yōu)化的問題妖枚,數(shù)據(jù)量大了后,有明顯延遲苍在。
性能優(yōu)化的前提是良好的構(gòu)架設(shè)計(jì):如果架構(gòu)本身的設(shè)計(jì)就存在問題盅惜,在怎么優(yōu)化也所能提升的空間也是很小。根據(jù)二八原則忌穿,大部分性能應(yīng)該消耗在很少的地方抒寂,所以優(yōu)化的關(guān)注點(diǎn)就在于那20%最耗時(shí)的代碼塊,解決了這個(gè)問題掠剑,整體性能就會(huì)有很大的提升屈芜。
代碼層面的優(yōu)化一般涉及到一下方面:

1.并發(fā)模型的選擇

對于不同的功能需要用不同的并發(fā)模型,適合單線程還是多線程朴译,以及線程池這些都會(huì)影響到性能井佑,對于服務(wù)器,模塊是io密集型還是計(jì)算密集型眠寿。例如如果一次請求是需要做很多的計(jì)算躬翁,那么用線程池是合理的能夠簡化編程,但是如果一次請求主要時(shí)間是等待io盯拱,那么線程池是無法提升吞吐量的盒发。

2.數(shù)據(jù)的存儲(chǔ)

容器的選擇

數(shù)據(jù)對象的存儲(chǔ)方式取決于對數(shù)據(jù)的使用方式例嘱,就拿C++容器來說,如果要存儲(chǔ)物品信息宁舰,一般系統(tǒng)中更多的是根據(jù)物品id來獲取物品信息拼卵,那么久需要用key-value來存取,但map是紅黑樹蛮艰,unorder_map是哈希表腋腮,哈希表的查詢時(shí)間是O(1),而對于map,插入壤蚜、刪除都是O(logN)即寡,最壞和平均都是。

存取方式

是存指針還是存數(shù)據(jù)袜刷,這個(gè)需要根據(jù)具體問題聪富,具體分析,盡量高效水泉。

3.算法

算法的存在就是為了高效的解決一些復(fù)雜問題,以減少時(shí)間或者空間復(fù)雜度窒盐。一個(gè)排序就有很多種選擇草则,冒泡,選擇蟹漓,快排炕横,堆排序,堆排序葡粒,歸并等份殿。一般來說快排的整體效率比較高,那是針對于基本無序的序列嗽交,如果只是后來的元素?zé)o序卿嘲,前面基本有序,這時(shí)候簡單的使用快排就會(huì)造成降低性能夫壁。

4.代碼質(zhì)量

使用引用

在C++中盡量采用引用傳遞或者指針傳遞拾枣,這樣不會(huì)產(chǎn)生參數(shù)拷貝,如果傳入?yún)?shù)是一個(gè)復(fù)雜的數(shù)據(jù)結(jié)構(gòu)盒让,就能明顯的提升性能梅肤。同理獲取數(shù)據(jù)時(shí)也要用引用。

減少副作用

例如C++是不進(jìn)行邊界檢查的邑茄,對于map的獲取value姨蝴,如果該key不在map中,map會(huì)插入一個(gè)key肺缕,value為默認(rèn)值

    std::map<int,int> i_map;
    int value = i_map[123];

map是紅黑樹實(shí)現(xiàn)的左医,紅黑樹最終是一平衡樹授帕,這個(gè)插入操作會(huì)導(dǎo)致原來的樹不平衡,內(nèi)部就需要翻轉(zhuǎn)達(dá)到平衡炒辉,這就會(huì)造成性能消耗豪墅。

同一變量的多次獲取:

std::vector<int> v_int;
...
for (int i = 0; i < v_int.size(); i++)

怎么寫出高質(zhì)量的C++代碼黔寇,推薦一本書 《高質(zhì)量C++/C編程指南》偶器。

同步鎖

服務(wù)器編程會(huì)涉及到多線程,一旦涉及多線程缝裤,多線程中很多涉及到競爭資源的非原子操作都需要進(jìn)行加鎖屏轰,加鎖的方式有很多種有信號量,互斥器憋飞,條件變量霎苗,讀寫鎖。絕大多數(shù)情況使用互斥器就可以足夠?qū)崿F(xiàn)大多數(shù)功能榛做,而且相對于其他鎖性能影響較小唁盏。但在使用mutex時(shí)也需要注意。

  • 鎖的范圍:只在需要同步的操作前后加鎖和解鎖检眯,避免造成其他線程的無效的等待厘擂,造成性能損失。
  • 盡量將操作劃分锰瘸,對于多種無前后依賴的臨界資源刽严,用多個(gè)互斥器。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末避凝,一起剝皮案震驚了整個(gè)濱河市舞萄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌管削,老刑警劉巖倒脓,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異含思,居然都是意外死亡把还,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門茸俭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吊履,“玉大人,你說我怎么就攤上這事调鬓⊥а祝” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵腾窝,是天一觀的道長缀踪。 經(jīng)常有香客問我居砖,道長,這世上最難降的妖魔是什么驴娃? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任奏候,我火速辦了婚禮,結(jié)果婚禮上唇敞,老公的妹妹穿的比我還像新娘蔗草。我一直安慰自己,他們只是感情好疆柔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布咒精。 她就那樣靜靜地躺著,像睡著了一般旷档。 火紅的嫁衣襯著肌膚如雪模叙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天鞋屈,我揣著相機(jī)與錄音范咨,去河邊找鬼。 笑死厂庇,一個(gè)胖子當(dāng)著我的面吹牛渠啊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宋列,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼昭抒,長吁一口氣:“原來是場噩夢啊……” “哼评也!你這毒婦竟也來了炼杖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤盗迟,失蹤者是張志新(化名)和其女友劉穎坤邪,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體罚缕,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡艇纺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了邮弹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片黔衡。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖腌乡,靈堂內(nèi)的尸體忽然破棺而出盟劫,到底是詐尸還是另有隱情,我是刑警寧澤与纽,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布侣签,位于F島的核電站塘装,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏影所。R本人自食惡果不足惜蹦肴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望猴娩。 院中可真熱鬧阴幌,春花似錦、人聲如沸胀溺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仓坞。三九已至背零,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間无埃,已是汗流浹背徙瓶。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嫉称,地道東北人侦镇。 一個(gè)月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像织阅,于是被迫代替她去往敵國和親壳繁。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

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