主頁 > 軟體設計 > 性能優化系列:每個程式員都應該知道的數字

性能優化系列:每個程式員都應該知道的數字

2021-10-19 07:08:35 軟體設計

目錄

前言

正文

看這些資料的目的

1)CPU非常非常快

2)記憶體很快了,但是相比CPU來說還是太慢了

3)磁盤性能非常非常慢

4)磁盤順序I/O比隨機讀I/O快很多

5)網路傳輸也是比較耗時的,基本都是毫秒級別

總結

最后

推薦閱讀


前言

交流群里最常聽到的一句話就是:我專案太垃圾了,面試怎么辦,說實話,我聽了也感同身受,因為我也是這么走過來的,而且,幾乎大部分人都會經歷這個程序,所以,不多說了,安排,

之所以挑性能優化這個方向,主要有幾個原因:

1)性能優化是我很感興趣的一個方向,同時在過去幾年,我在這個方向上積累了一些經驗,可以說,我之前的面試,專案上幾乎是靠性能優化一招走遍天下,因此,我覺得可以拿出來和大家分享一下,

2)性能優化非常通用,幾乎對于所有線上專案都可以適用,大家掌握了之后,立馬可以到專案中實踐起來,我想,應該不存在不需要性能優化的專案,除非你的專案只有“Hello world”,

3)性能優化大部分內容非常簡單,幾乎沒有門檻,經驗較淺的同學也很容易上手,同時性能優化也適用二八原則:掌握20%的內容,足以解決80%的問題,

4)性能優化很容易拿到結果,稍微有經驗點的同學應該知道,做需求最怕拿不到結果,性能優化就不一樣了,都是很直白的數字,1小時的任務,我優化成5分鐘,性能提升就是十來倍,簡單粗暴,

不多說了,開懟,

正文

文章的標題來源于 Jeff Dean 在谷歌的內部一次分布式系統的演講,英文標題為:Numbers Everyone Should Know,

這些數字與我們后續做性能優化息息相關,因此我將這部分內容放在第一篇,幫助大家建立基本的性能概念,

先來看 Jeff Dean 所說的數字是哪些:

注:1μs = 1000ns、1ms = 1000μs

操作

耗時/延遲

耗時*10億

一級快取讀取(L1)

0.5ns

0.5s

分支錯誤預測

5ns

5s

二級快取讀取(L2)

7ns

7s

互斥鎖的加鎖解鎖

25ns

25s

記憶體尋址

100ns

100s

Zippy壓縮1KB資料

3000ns(3μs)50min

在1Gbps網路上發送1KB資料

10,000ns(10μs)

2.8h

從SSD(1GB/s)隨機讀取4KB資料

150,000ns(150μs)1.7days

從記憶體順序讀取1MB資料

250,000ns(250μs)

2.9days
資料包在同資料中心一個往返500,000ns(500μs)5.8days

從SSD(1GB/s)順序讀取1MB資料

1,000,000ns(1ms)11.6days

磁盤尋道

10,000,000ns(10ms)

3.8months

從磁盤順序讀取1MB資料

20,000,000ns(20ms)

7.9months

資料包從美國到荷蘭一個往返

150,000,000ns(150ms)

4.75years

表格第三列將耗時資料提升10億倍,換算成大家更容易看的單位,

這份資料的最初來源為 Peter Norvig 的文章:Teach Yourself Programming in Ten Years,地址:http://norvig.com/21-days.html,

伯克利的 Colin Scott 根據這份資料,通過一定的演算法,制作了一個可以根據時間的推移而變化的網站,地址為:https://colin-scott.github.io/personal_website/research/interactive_latency.html,原始碼中注釋有詳細解釋計算邏輯,例如網路帶寬是按每2年增加1倍,DRAM帶寬按每3年增加一倍,

根據 Colin Scott 的圖表來看,到2021年,網路帶寬、記憶體、SSD、磁盤,都有數量級的提升,而 CPU 相關的一二級快取變化不大,有興趣的可以自己點進去看一看,

看這些資料的目的

首先,這些資料肯定不是完全準確的,受限于眾多環境因素的影響,其實很難有所謂的準確數字,

我們看這些資料更多是了解每個操作的耗時量級,各個操作之間的數量級比率,從而對于我們作業中接觸到的一些相關知識有初步的概念,

而我將這個資料放在性能優化系列文章的開篇,主要想先傳達給各位同學幾個概念:

1)CPU非常非常快

CPU執行大部分簡單指令只需要1個時鐘周期,我用個人電腦測驗時,CPU可以睿頻到4.40GHz(見第2點的測驗圖),也就是說此時執行一個簡單指令需要的時間大約是1/4.4ns,也就是0.23ns(納秒),

這是什么概念了,舉個簡單的例子,即使是真空中傳播的光,在0.23ns內也只能走不到7厘米,

2)記憶體很快了,但是相比CPU來說還是太慢了

CPU和記憶體之間的瓶頸通常稱為馮·諾伊曼瓶頸,具體差別有多大了,我用自己的電腦做了個簡單的測驗,

我電腦是今年剛買的,硬體應該都還比較新,但是配置比較普通,僅供參考,

CPU配置是 11th Gen Intel Core i5-11400F@2.60GHz,睿頻4.40GHz,測驗結果看也確實跑到了4.40GHz了,記憶體配置是 DDR4 3200MHz,

測驗結果如下圖所示:

從上圖看,記憶體的讀取速度為41GB/s,感徑訓是挺快的,但是L1 Cache為3TB/s,一比較,相差還是很大,

如果CPU按4.40GHz來算,執行一個簡單指令需要的時間大約是0.23ns(納秒),而記憶體的延遲是88.7ns,相當于CPU去記憶體里取一個位元組,需要等待386個周期,可以看出,記憶體相較于CPU來說,確實太慢了,

這也是為什么引入了L1、L2、L3快取的原因,不過這邊我們不深入去研究這些東西,只是對CPU和記憶體的性能差距有個大概概念,

3)磁盤性能非常非常慢

這個大家估計大家都知道,具體有多慢了,我這邊在用自己的電腦做了個簡單的測驗,

我電腦剛好有兩塊硬碟,一塊256GB的SSD(固態硬碟),一塊1T的HDD(機械硬碟),

SSD測驗結果如下圖所示:

忽略佇列(Q)和執行緒(T)的影響,順序讀(SEQ)的性能為1535.67MB/s,隨機讀(RND)的性能為49.61MB/s,

對比下上面記憶體的性能41GB/s,盡管是SSD,性能還是存在數量級的差距,另一個就是隨機讀的性能相比順序讀也是存在數量級的差距,

HDD測驗結果如下圖所示:

忽略佇列(Q)和執行緒(T)的影響,順序讀(SEQ)的性能為183.49MB/s,隨機讀(RND)的性能為0.6MB/s,

對比下上面SSD的性能:順序讀1535.67比183.49,存在一個數量級的差距,隨機讀49.61比0.6,存在兩個數量級的差距,

而HDD順序讀和隨機讀的性能差距相比SSD就比較嚴重了,大概有300倍,簡直慘不忍睹,不過相信現在的服務器應該基本都是SSD了,如果發現自己公司服務器的磁盤還是HDD,那就趕緊溜吧,

4)磁盤順序I/O比隨機讀I/O快很多

這個在上面的測驗也看出來了,都是數量級上的差距,特別是在以前的HDD上,有不少技術就是利用了順序I/O性能好的特點來提升性能,典型的有:kafka順序寫訊息、Leveldb和RocksDB底層使用的LSM-Tree等,

5)網路傳輸也是比較耗時的,基本都是毫秒級別

在開始的表格中可以看到,在同資料中心一個往返,需要0.5ms,

如果是跨城市就更久了,這個相信也不難理解,畢竟信號要順著網線爬,距離越遠,當然所需時間就越久了,

下圖是上海到一些城市進行PING操作所需的時間,可以看到張家口已經需要30ms左右了,這也差不多就是北上的延遲,

這也是為什么我們在服務器的路由策略上通常會優先使用同機房優先、同中心優先的策略,

這讓我想到我之前碰到的一個問題,當時是一個新服務在測驗,資料庫基本沒資料,測驗場景也是很簡單的增刪改查,但是介面的性能就是很差,動不動就上百毫秒,

仔細看了呼叫鏈后,發現每次DB操作都需要30ms左右,看了下機房分布后,發現是應用服務器和資料庫服務器跨城市了,一個在北京一個在上海,導致會有固定30ms左右的延遲,將兩者換到同機房后,基本就是1ms了,

總結

本文著重介紹了業務開發在做性能優化需要掌握的一些核心概念,之所以放在最先介紹,是因為在我做性能優化的程序中,發現絕大多數性能問題都是由于網路I/O和磁盤I/O引起的,對這些概念心中有數后,有利于我們更快的定位出性能瓶頸,從而更快的解決問題,

有同學可能會問,下一篇文章什么時候,不會又是兩個月后吧?

答:跟大家聊下為什么更新間隔這么久,一個是確實變懶了,這個毋庸置疑,有一些其他的事情就忘了這邊,比如從幾個月前開始我堅持每天健身,當然歸根到底有很大的原因是動力的問題,

另外一個就是作業確實比較忙,現在做的專案比較有挑戰,基本都是幾十萬上百萬的QPS,幾十億的資料量,很多問題都不可同日而語,因此要做的事情很多,挑戰比較大,所以需要花比較多的時間去思考和維護,

然后,道理是這樣的,很多同學都有白嫖的習慣,這個我不反對,因為我自己也經常白嫖,但是如果你確實覺得這個系列文章對你有幫助,你希望能加快更新速度,那最好的方式是給我點反饋,一鍵三什么你懂的,

我需要有反饋才能知道文章對大家是否有幫助,如果好的反饋多了,我知道文章對大家幫助很大,自然就會更新的勤快點,通宵什么的說不定也干的出來,我狠起來我自己都怕,

最后

我是囧輝,一個堅持分享原創技術干貨的程式員

推薦閱讀

Java 基礎高頻面試題(2021年最新版)

Java 集合框架高頻面試題(2021年最新版)

面試必問的 MySQL,你懂了嗎?

面試必問的執行緒池,你懂了嗎?

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/323060.html

標籤:其他

上一篇:爬取中國大學排名并作可視化分析(應粉絲要求)——python作業

下一篇:保姆級教程CSS兩萬字筆記大總結【建議收藏】(上篇)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more