1. 程式人生 > >程式設計師應該瞭解的數字

程式設計師應該瞭解的數字

幾年前的一篇文章了,關於程式訪問儲存器所需時間的文章。對於程式訪問cache、記憶體、硬碟、網路等裝置,只是大概知道訪問哪些裝置快,哪些裝置慢;具體多塊或多慢,沒有明確概念。現代的裝置訪問速度已經超過幾年前,但是瞭解這些數值仍然有意義。

首先明確一下時間單位之間的換算關係:
秒(s)、毫秒(ms)、微秒 (μs)、納秒(ns)之間關係為:
1s = 103ms = 106μs = 109ns

寫硬碟操作“昂貴”

  • 資料儲存是事務型別:寫操作要求訪問硬碟
  • 訪問硬碟意味著磁碟尋道
  • 經驗法則:每次尋道耗時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倍。
  • 全域性共享資料代價昂貴,這是分散式系統中基本的限制。在頻繁寫物件的操作中鎖衝突降低了效能,使得事物變為序列操作,變慢。
  • 構建寫擴充套件
  • 優化少量的寫衝突
  • 廣度優化。使得寫操作儘可能並行。

下面這張圖比較形象展示了數值之間的對比關係:
blog_004.jpg

參考