偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

聊聊軟件性能優(yōu)化全景

開發(fā) 架構(gòu)
性能優(yōu)化是指在不影響正確性的前提下,使程序運(yùn)行得更快,它是一個(gè)非常廣泛的話題。

[[361266]]

本文轉(zhuǎn)載自微信公眾號(hào)「碼磚雜役」,作者我不想種地。轉(zhuǎn)載本文請(qǐng)聯(lián)系碼磚雜役公眾號(hào)。  

性能優(yōu)化是指在不影響正確性的前提下,使程序運(yùn)行得更快,它是一個(gè)非常廣泛的話題。

軟件產(chǎn)品多種多樣,影響程序執(zhí)行效率的因素很多,因此,性能優(yōu)化,特別是對(duì)不熟悉的項(xiàng)目做優(yōu)化,不是一件容易的事。

性能優(yōu)化可分為宏觀和微觀兩個(gè)層面。宏觀層面包括架構(gòu)重構(gòu),而微觀層面,則包括算法的優(yōu)化,編譯優(yōu)化,工具分析,高性能編碼等,這些方法是有可能獨(dú)立于具體業(yè)務(wù)邏輯,因而有更加廣泛的適應(yīng)性,且更易于實(shí)施。

具體到性能優(yōu)化的方法論,首先,應(yīng)建立度量,你度量什么,你得到什么。所以,性能優(yōu)化測(cè)試先行,須基于數(shù)據(jù)而不能憑空猜測(cè),這是做優(yōu)化的一個(gè)基本原則。搭建真實(shí)的壓測(cè)環(huán)境,或者逼近真實(shí)環(huán)境,有時(shí)候是困難的,也可能非常耗費(fèi)時(shí)間,但它依然是值得的。

有許多工具能幫助我們定位程序瓶頸,有些工具能做很友好的圖形化展示,定位問(wèn)題是解決問(wèn)題的前置條件,但定位問(wèn)題可能不是最難的,分析和優(yōu)化才是最耗時(shí)的關(guān)鍵環(huán)節(jié),修改之后,要再回歸測(cè)試,驗(yàn)證是否如預(yù)期般有效。

什么是高性能程序?架構(gòu)致廣遠(yuǎn)、實(shí)現(xiàn)盡精微。

架構(gòu)優(yōu)化的關(guān)鍵是識(shí)別瓶頸,這類優(yōu)化有很多套路,比如通過(guò)負(fù)載均衡做分布式改造,比如用多線程協(xié)程做并行化改造,比如用消息隊(duì)列做異步化和解耦,比如用事件通知替代輪詢,比如為數(shù)據(jù)訪問(wèn)增加緩存,比如用批處理+預(yù)取提升吞吐,比如IO與邏輯分離、讀寫分離等等。

架構(gòu)調(diào)整和優(yōu)化雖然收效很大,卻因受限于各種現(xiàn)實(shí)因素,因而并不總是可行。

能不做的盡量不做、必須做的高效做是性能優(yōu)化的一個(gè)根本法則,提升處理能力和降低計(jì)算量可視為性能優(yōu)化的兩個(gè)方向。

怎么讓程序跑的更快?這要求我們充分利用硬件的各種特性,想方設(shè)法減少等待并且提高并發(fā),提升CACHE命中率,使用更高效的結(jié)構(gòu)和算法;而降低計(jì)算量,則可能意味著要跳出純技術(shù)范疇,從產(chǎn)品和業(yè)務(wù)視角去審視:哪些功能是必須的,哪些功能是可選可配置的。

有時(shí)候,我們不得不從細(xì)節(jié)的維度去改進(jìn)程序。通常,我們應(yīng)該使用簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)和算法,但如有必要,就應(yīng)積極使用更高效的結(jié)構(gòu)和算法,不止邏輯結(jié)構(gòu),物理結(jié)構(gòu)(實(shí)現(xiàn))同樣影響執(zhí)行效率;分支預(yù)測(cè)、反饋優(yōu)化、啟發(fā)性以及基于機(jī)器學(xué)習(xí)編譯優(yōu)化的效果日益凸顯;熟練掌握編程語(yǔ)言深刻理解標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)能幫助我們規(guī)避低性能陷阱;深入細(xì)節(jié)做代碼微調(diào)甚至指令級(jí)優(yōu)化有時(shí)候也能取得意想不到的效果。

有時(shí)候,我們需要做一些交換,比如用空間置換時(shí)間,比如犧牲一些通用性可讀性換取高性能,我們只應(yīng)當(dāng)在非常必要的情況下才這么做,它是權(quán)衡的藝術(shù)。

## 1、架構(gòu)優(yōu)化

### 負(fù)載均衡

負(fù)載均衡其實(shí)就是解決一個(gè)分活的問(wèn)題,對(duì)應(yīng)到分布式系統(tǒng),一般在邏輯服的前面都會(huì)安放一個(gè)負(fù)載均衡器,比如NGINX就是經(jīng)典的解決方案。負(fù)載均衡不限于分布式系統(tǒng),對(duì)于多線程架構(gòu)的服務(wù)器內(nèi)部,也需要解決負(fù)載均衡的問(wèn)題,讓各個(gè)worker線程的負(fù)載均衡。

### 多線程、協(xié)程并行化

雖然硬件架構(gòu)的復(fù)雜化對(duì)程序開發(fā)提出了更高的要求,但編寫充分利用多CPU多核特性的程序能獲得令人驚嘆的收益,所以,在同樣硬件規(guī)格下,基于多線程/協(xié)程的并行化改造依然值得嘗試。

多線程不可避免要面臨資源競(jìng)爭(zhēng)的問(wèn)題,我們的設(shè)計(jì)目標(biāo)應(yīng)該是充分利用硬件多執(zhí)行核心的優(yōu)勢(shì),減少等待,讓多個(gè)執(zhí)行流暢快的奔跑起來(lái)。

對(duì)于多線程模型,如果把每一個(gè)要干的活抽象為一個(gè)task,把干活的線程抽象為worker,那么,有兩種典型的設(shè)計(jì)思路,一種是對(duì)task類型做出劃分,讓一類或者一個(gè)worker去干特定的task,另一種是讓所有worker去干所有task。

第一種劃分,能減少數(shù)據(jù)爭(zhēng)用,編碼實(shí)現(xiàn)也更簡(jiǎn)單,只需要識(shí)別有限的競(jìng)爭(zhēng),就能讓系統(tǒng)工作的很好,缺點(diǎn)是任務(wù)的工作量很可能不同,有可能導(dǎo)致有些worker忙碌而另一些空閑。

第二種劃分,優(yōu)點(diǎn)是能均衡,缺點(diǎn)是編碼復(fù)雜性高,數(shù)據(jù)競(jìng)爭(zhēng)多。

有時(shí)候,我們會(huì)綜合上述兩種模式,比如讓單獨(dú)的線程去做IO(收發(fā)包)+反序列化(產(chǎn)生protocol task),然后啟動(dòng)一批worker線程去處理包,中間通過(guò)一個(gè)task queue去連接,這即是經(jīng)典的生產(chǎn)者消費(fèi)者模型。

協(xié)程是一種用戶態(tài)的多執(zhí)行流,它基于一個(gè)假設(shè),即用戶態(tài)的任務(wù)切換成本低于系統(tǒng)的線程切換。

### 通知替代輪詢

輪詢即不停詢問(wèn),就像你每隔幾分鐘去一趟宿管那里查看是否有信件,而通知是你告訴宿管阿姨,你有信的時(shí)候,她打電話通知你,顯然輪詢耗費(fèi)CPU,而通知機(jī)制效率更高。

### 添加緩存

緩存的理論依據(jù)是局部性原理。

一般系統(tǒng)的寫入請(qǐng)求遠(yuǎn)少于讀請(qǐng)求,針對(duì)寫少讀多的場(chǎng)景,很適合引入緩存集群。

在寫數(shù)據(jù)庫(kù)的時(shí)候同時(shí)寫一份數(shù)據(jù)到緩存集群里,然后用緩存集群來(lái)承載大部分的讀請(qǐng)求,因?yàn)榫彺婕汉苋菀鬃龅礁咝阅埽?,這樣的話,通過(guò)緩存集群,就可以用更少的機(jī)器資源承載更高的并發(fā)。

緩存的命中率一般能做到很高,而且速度很快,處理能力也強(qiáng)(單機(jī)很容易做到幾萬(wàn)并發(fā)),是理想的解決方案。

CDN本質(zhì)上就是緩存,被用戶大量訪問(wèn)的靜態(tài)資源緩存在CDN中是目前的通用做法。

### 消息隊(duì)列

消息隊(duì)列、消息中間件是用來(lái)做寫請(qǐng)求異步化,我們把數(shù)據(jù)寫入MessageQueue就認(rèn)為寫入完成,由MQ去緩慢的寫入DB,它能起到削峰填谷的效果。

消息隊(duì)列也是解耦的手段,它主要用來(lái)解決寫的壓力。

### IO與邏輯分離、讀寫分離

IO與邏輯分離,這個(gè)前面已經(jīng)講了。讀寫分離是一種數(shù)據(jù)庫(kù)應(yīng)對(duì)壓力的慣用措施,當(dāng)然,它也不僅限于DB。

### 批處理與數(shù)據(jù)預(yù)取

批處理是一種思想,分很多種應(yīng)用,比如多網(wǎng)絡(luò)包的批處理,是指把收到的包攢到一起,然后一起過(guò)一遍流程,這樣,一個(gè)函數(shù)被多次調(diào)用,或者一段代碼重復(fù)執(zhí)行多遍,這樣i-cache的局部性就很好,另外,如果這個(gè)函數(shù)或者一段里要訪問(wèn)的數(shù)據(jù)被多次訪問(wèn),d-cache的局部性也能改善,自然能提升性能,批處理能增加吞吐,但通常會(huì)增大延遲。

另一個(gè)批處理思想的應(yīng)用是日志落盤,比如一條日志大概寫幾十個(gè)字節(jié),我們可以把它緩存起來(lái),攢夠了一次寫到磁盤,這樣性能會(huì)更好,但這也帶來(lái)數(shù)據(jù)丟失的風(fēng)險(xiǎn),不過(guò)通常我們可以通過(guò)shm的方式規(guī)避這個(gè)風(fēng)險(xiǎn)。

指令預(yù)取是CPU自動(dòng)完成的,數(shù)據(jù)預(yù)取是一個(gè)很有技巧性的工作,數(shù)據(jù)預(yù)取的依據(jù)是預(yù)取的數(shù)據(jù)將在接下來(lái)的操作中用到,它符合空間局部性原理,數(shù)據(jù)預(yù)取可以填充流水線,降低訪存等待,但數(shù)據(jù)預(yù)取會(huì)侵害代碼,且并不總?cè)珙A(yù)期般有效。

哪怕你不增加預(yù)取代碼,硬件預(yù)取器也有可能幫你做預(yù)取,另外gcc也有編譯選項(xiàng),開啟它會(huì)在編譯階段自動(dòng)插入預(yù)取代碼,手動(dòng)增加預(yù)取代碼需要小心處理,時(shí)機(jī)很重要,最后一定要基于測(cè)試數(shù)據(jù),另外,即使表現(xiàn)很好,但代碼修改也有可能導(dǎo)致效果衰減,而且預(yù)取語(yǔ)句執(zhí)行本身也有開銷,只有預(yù)取的收益大于預(yù)取的開銷才是值得的。

累啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦,寫不動(dòng)啦啦啦!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!哪天有空再寫后面的章節(jié)吧

## 2、算法優(yōu)化

### 哈希(HASH)

#### 哈希和字符串比較

#### HashMap

#### 哈希和平衡搜索樹的比較

### 基于有序數(shù)組的二分查找

### 數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)優(yōu)化

### 延遲計(jì)算 & 寫時(shí)拷貝

### 預(yù)計(jì)算

### 增量更新

## 3、代碼優(yōu)化

### 內(nèi)存優(yōu)化

小對(duì)象分配器

內(nèi)存分配和對(duì)象構(gòu)建分離

### cache優(yōu)化

i-cache優(yōu)化、d-cache優(yōu)化、cache對(duì)齊、結(jié)構(gòu)體重排

### 判斷前置

### 整體操作替代小操作

### 復(fù)用

### 減法

#### 減少冗余

#### 減少拷貝、零拷貝

#### 減少參數(shù)個(gè)數(shù)(寄存器參數(shù)、取決于ABI約定)

#### 減少函數(shù)調(diào)用次數(shù)/層次

#### 減少存儲(chǔ)引用次數(shù)

#### 減少無(wú)效初始化和重復(fù)賦值

### 循環(huán)優(yōu)化

### 防御性編程適可而止

### release干凈

### 慎用遞歸

## 4、編譯優(yōu)化

### inline

### restrict

### LTO

### PGO

### 優(yōu)化選項(xiàng)

## 5、其他優(yōu)化

### 綁核

### SIMD

### 鎖與并發(fā)

#### 鎖的粒度

#### 無(wú)鎖編程

#### Per-cpu data structure & thread local

#### 內(nèi)存屏障

小結(jié)

性能優(yōu)化是一項(xiàng)細(xì)致的工作,工程師們?cè)铝τ趯ふ乙粍谟酪萁鉀Q性能問(wèn)題的捷徑,但遺憾的是,沒(méi)有銀彈,但這并不意味著性能優(yōu)化無(wú)章可循。軟件工程師們?cè)谛阅軆?yōu)化方面積累了大量的經(jīng)驗(yàn),包括架構(gòu)、緩存、預(yù)取、工具、編譯器與編程語(yǔ)言,代碼重構(gòu)等實(shí)踐經(jīng)驗(yàn)方方面面,這些方法和探討都具有借鑒意義。

性能優(yōu)化也是一個(gè)系統(tǒng)性工程,出現(xiàn)性能瓶頸再優(yōu)化是一種先污染后治理的思路。更好的方式是將性能貫穿于軟件的整個(gè)生命周期之中,在設(shè)計(jì)之初即把性能作為一項(xiàng)需求甚至關(guān)鍵目標(biāo)加以考慮,開發(fā)中持續(xù)監(jiān)控性能的變化并嚴(yán)格遵從高性能編碼規(guī)范,后期維護(hù)將性能納入維護(hù)體系。

嚴(yán)格的說(shuō),性能優(yōu)化和性能設(shè)計(jì)有所不同,性能優(yōu)化通常是在現(xiàn)有系統(tǒng)和代碼基礎(chǔ)上做改進(jìn),它并非推倒重來(lái),考驗(yàn)的是開發(fā)者反向修復(fù)的能力,而性能設(shè)計(jì)考驗(yàn)的是設(shè)計(jì)者的正向設(shè)計(jì)能力,但性能優(yōu)化的方法可以指導(dǎo)性能設(shè)計(jì),兩者互補(bǔ)。

 

責(zé)任編輯:武曉燕 來(lái)源: 碼磚雜役
相關(guān)推薦

2024-02-29 18:06:39

HTTP性能優(yōu)化

2021-05-19 08:04:11

ASP.Net服務(wù)性原則

2024-07-11 08:26:00

2021-11-18 08:20:22

接口索引SQL

2022-03-11 10:23:02

React性能優(yōu)化

2022-02-21 13:27:11

接口性能優(yōu)化索引命令

2022-03-02 10:36:37

Linux性能優(yōu)化

2021-01-14 08:58:12

Synchronize鎖操作

2025-06-11 02:10:00

2025-03-13 05:00:00

2024-11-04 09:52:19

單例模式性能內(nèi)存

2023-12-29 08:29:15

QPS系統(tǒng)應(yīng)用

2021-06-02 10:00:30

云網(wǎng)絡(luò)性能測(cè)試

2021-12-02 07:02:16

API性能設(shè)計(jì)

2020-11-11 10:00:13

NAT性能內(nèi)核

2021-06-11 06:54:35

DPDK優(yōu)化HugeTLB

2023-09-01 08:59:57

2025-06-03 00:00:06

性能優(yōu)化性能指標(biāo)響應(yīng)時(shí)間

2014-12-10 10:12:02

Web

2011-08-03 16:51:01

jQuery
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)