結(jié)合大學(xué)時計算機組成原理老師的教導(dǎo),和本人積累的經(jīng)驗和思考,將一些系統(tǒng)性能優(yōu)化的套路總結(jié)了一下晴竞。不包含具體的優(yōu)化場景,只提供方向狠半。
所以本文看起來會有點廢話連篇噩死。
1. Profiling
系統(tǒng)優(yōu)化之前最重要的是profiling,profile有“畫像神年,輪廓”的意思已维,可以理解為對整個系統(tǒng)進行摸底,看一下每個過程需要多長時間已日,過程是并行的還是串行的等等垛耳。
在profiling完成之后,應(yīng)當(dāng)能區(qū)分出流程中的子系統(tǒng)。
子系統(tǒng)區(qū)分如何完成艾扮,主要看耗費時間的數(shù)量級。
數(shù)量級差不多的流程占婉,就可以劃分到一個子系統(tǒng)里泡嘴。
子系統(tǒng)劃分出來,按照流程連接逆济,就形成一個DAG酌予,求出關(guān)鍵路徑之后,優(yōu)化的工作才能啟動奖慌。
2. 子系統(tǒng)的優(yōu)化
在子系統(tǒng)中抛虫,時間耗費的數(shù)量級一樣,因此第一條優(yōu)化思路就是加快經(jīng)常性事件简僧。
對于程序優(yōu)化建椰,就是找熱點函數(shù)。各語言都有自己的profiling工具岛马,這里不細講棉姐。
問題來了,如何加快經(jīng)常性事件啦逆?
有下面幾種套路
3. 使用更優(yōu)的算法
我們可能創(chuàng)造不出快排這種算法伞矩,也想不出紅黑樹這種數(shù)據(jù)結(jié)構(gòu)。
但是有一些套路還是比較簡單的夏志。
比如:
預(yù)先處理
比如預(yù)先計算乃坤,預(yù)先申請,預(yù)先讀取等等沟蔑。
預(yù)先計算就是先將所有可能的結(jié)果計算出來湿诊,外部需要的時候直接取。
增量處理
增量處理算法上也要做支持溉贿,這里的例子就太多了枫吧。
比如數(shù)據(jù)庫的增量備份和同步,文件的增量打包和同步等等宇色。
批量處理
將原本需要多次傳輸九杂、多次寫入或多次讀取的操作,改成一次批量處理宣蠕。
4. 使用更快的存儲器
mysql換成redis例隆,硬盤換成內(nèi)存,內(nèi)存換成cache抢蚀,使用更快的存儲器來存儲你的數(shù)據(jù)镀层,可以顯著提升效率。
在實踐上,我們用redis存儲不太重要的數(shù)據(jù)唱逢;把文件加載到內(nèi)存吴侦,不用每次讀取坞古;給CPU加上L1 Cache备韧,L2 Cache,不用每次從內(nèi)存中取痪枫。
5. 使用更多的CPU
這里包含兩個方向:一個是從單線程到多線程的優(yōu)化织堂,一個是多線程之間的優(yōu)化。
單線程到多線程的優(yōu)化奶陈,可能會受到場景的限制易阳,有些場景可能本來就是串行的,無法進行多核優(yōu)化吃粒。
多線程之間的優(yōu)化潦俺,就是同步手段的優(yōu)化,比如互斥鎖改為讀寫鎖声搁,一些簡單的場景黑竞,可能原子操作就能滿足要求。
一些壓縮算法疏旨,是可以并行處理的很魂,利用多核的優(yōu)勢,可以很輕松的減少50-75%的時間檐涝。
總結(jié)
總體來看遏匆,優(yōu)化的方向在于計算,存儲谁榜,并行三大方向幅聘,當(dāng)然這三個方面也要相互配合才能達到最佳效果。