程式設計師應該瞭解的數字
阿新 • • 發佈:2019-02-13
幾年前的一篇文章了,關於程式訪問儲存器所需時間的文章。對於程式訪問cache、記憶體、硬碟、網路等裝置,只是大概知道訪問哪些裝置快,哪些裝置慢;具體多塊或多慢,沒有明確概念。現代的裝置訪問速度已經超過幾年前,但是瞭解這些數值仍然有意義。
首先明確一下時間單位之間的換算關係:
秒(s)、毫秒(ms)、微秒 (μs)、納秒(ns)之間關係為:
寫硬碟操作“昂貴”
- 資料儲存是事務型別:寫操作要求訪問硬碟
- 訪問硬碟意味著磁碟尋道
- 經驗法則:每次尋道耗時10ms
- 簡單的數學計算: 1s / 10ms = 100 seeks /sec,即每秒最多100次尋道
- 具體依賴: 資料的大小和是否批量讀取
讀硬碟操作“便宜”
- 讀操作不是事務型別
- 資料只需從硬碟讀一次,之後很容易命中
- 後續的讀直接從記憶體讀取
- 經驗法則: 從記憶體讀1M資料需要250μs
- 簡單資料計算: 1s / 250μs = 4GB/S,即每秒讀4GB
- 對於1M的資料,每秒可以取4000次
各種資料
下面這組資料出自Jeff Dean在Google全體工程大會的報告。
- L1 cache的引用0.5ns
- Branch mispredict 5ns
- L2 cache的引用 7ns
- Mutex lock/unlock 100ns=0.1μs
- 引用主記憶體 100ns=0.1μs
- 使用Zippy壓縮1kb資料 10,000 ns=10μs
- 1Gbps網絡卡,傳送2kb資料 20,000ns=20μs
- 從記憶體連續讀1M資料 250,000ns=250μs
- 一個數據中心內的round trip 500,000ns=500μs
- 磁碟尋道10,000,000ns=10ms
- 從網路連續讀1M資料 10,000,000ns=10ms
- 傳送包 CA->Netherlands->CA 150,000,000ns=150ms
經驗
- 寫操作比讀操作慢40倍。
- 全域性共享資料代價昂貴,這是分散式系統中基本的限制。在頻繁寫物件的操作中鎖衝突降低了效能,使得事物變為序列操作,變慢。
- 構建寫擴充套件
- 優化少量的寫衝突
- 廣度優化。使得寫操作儘可能並行。
下面這張圖比較形象展示了數值之間的對比關係: