您好,登錄后才能下訂單哦!
本篇內容主要講解“怎么做性能優化”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么做性能優化”吧!
問題分析
標題中問出了兩個問題,一個是有沒有做過性能優化的工作,一個是從哪些方面入手做性能優化。對于第一個問題,我們可以直接回答有或者沒有。相信小伙伴們都希望自己做過性能優化的工作,如果是回答做過,那第二個問題,我們又該如何回答呢?
首先,對于第二個問題來說,問的是會從哪些方面入手。這個問題就沒有固定答案了。你可以按照你以往的經驗來回答這個問題,但是,在回答這個問題之前,需要先好好梳理下你的思路,將你要表達的說清楚。
接下來,我們就一起來聊聊第二個問題:你會從哪些方面入手做性能優化?
我們可以從性能優化的幾個方面來進行回答。下面,我們就來聊聊性能優化可以從哪些方面進行。
性能優化有哪些方面?
這里,我結合平時工作中的總結,將性能優化總結為下面這張圖。
也就是說,我們可以從數據聚合優化、資源沖突優化、算法優化、JVM優化、復用優化、計算優化和快速實現等方面來進行回答。接下來,我們就針對每個點進行說明。
數據聚合優化
數據聚合優化主要針對的是對于數據的整合和傳輸的優化。比如:我們從數據庫中查詢出的數據,經過程序的聚合處理后再返回給客戶端,而不用客戶端調用多次接口來分別獲取數據。
再比如:我們在項目中使用的Nginx,一般都會開啟GZIP壓縮,使傳輸的數據更加緊湊,同時,使傳輸的數據量更小。
細心的小伙伴會發現,我們對于數據聚合的優化,主要是使傳輸的數據量更小。所以,我們在使用SQL語句查詢數據庫中的數據時,盡量查詢那些需要的字段,對于不需要的字段就直接忽略不查詢了,避免在SQL語句中出現select *
資源沖突優化
在我們平時的工作中,尤其是在高并發的場景下,經常會出現鎖沖突的問題,鎖沖突是資源沖突的一個典型場景。
關于鎖我們可以聯想到數據庫的行鎖、表鎖、Java中的synchronized和Lock等。如果對應到操作系統級別,則會有CPU命令級別的鎖,JVM指令級別的鎖,操作系統的內部鎖等。
這里,小伙伴們需要注意一點:只有在并發的場景下,才會出現資源沖突的問題。也就是說:在同一時刻,只能有一個請求獲取到請求資源,解決沖突的方式就是加鎖。
算法優化
在一個大型的互聯網項目中,往往涉及到分布式和微服務等技術,其中,也會使用到大量的數據結構和算法,對于算法的優化能夠顯著的提高系統的性能。一個好的實現,相比于一個拙劣的實現來說,在系統性能的提升上存在著巨大的差異。
比如,作為 List 的實現,LinkedList 和 ArrayList 在隨機訪問的性能上,差了好幾個數量級;又比如,CopyOnWriteList 采用寫時復制的方式,可以顯著降低讀多寫少場景下的鎖沖突。而什么時候使用同步,什么時候是線程安全的,也對我們的編碼能力有較高的要求。
所以,我們需要在平時工作過程中,多多積累數據結構和算法的相關知識。
JVM優化
JVM調優,不用說,這是每個Java工程師必須要掌握的標準技能。所有的Java程序最終都是運行在JVM中的,對JVM進行優化也能夠提升Java程序的性能。但是,需要注意的是:如果在優化JVM時,參數設置不當,可能會造成內存溢出等嚴重的問題。
目前被廣泛使用的垃圾回收器是 G1,通過很少的參數配置,內存即可高效回收。CMS 垃圾回收器已經在 Java 14 中被移除,由于它的 GC 時間不可控,有條件應該盡量避免使用。
復用優化
復用優化,這個看名字就知道,說白了就是可以重復利用。估計很多小伙伴都有這樣的經驗,在寫代碼的時候,可以將很多重復的代碼抽象出來,做成公共的方法。這樣,就不用每次都去寫重復的邏輯代碼了。這是代碼層面的復用。
如果是數據層面的話,我們可以使用緩沖和緩存來復用數據。
這里,小伙伴們需要注意一個知識點:緩沖主要針對的是寫操作,緩存主要針對的是讀操作。
另一個復用優化的典型場景就是池化技術,比如:數據庫連接池、線程池等。
計算優化
對于計算優化來說,我們可以從以下幾個小的方面來闡述。
并行計算
不難理解,就是多個計算同時進行。這里,又可以將并行計算分為:多機并行計算、多進程并行計算和多線程并行計算。
多機并行計算: 將一個大的計算任務,拆分成N個小的計算任務,分發到不同的機器進行處理。典型的場景就是Hadoop的MapReduce極端。
多進程計算: 比如,Nginx采用的NIO模型,采用的是進程調度的策略,由Master進程調度Worker進程,Worker進行來處理具體的請求。
多線程計算:對于多線程計算來說,也是我們平時接觸最多的一種計算方式,我們可以使用多線程技術,將復雜的邏輯計算拆分成一個個小的計算任務,分發到不同的線程中去執行。
同步變異步
同步和異步的區別就是:同步需要等待返回結果,異步不需要等待返回結果。如果我們在業務程序中,不需要等待返回結果數據,則我們可以將同步調用優化為異步調用,從而提升我們系統的性能。
懶加載
最典型的場景就是Spring中的懶加載,只有第一次獲取bean的時候,才會創建bean實例。
快速實現
對于快速實現來說,不僅包含我們需要利用相關的程序框架迅速開發出我們想要的業務,也需要我們在進行技術選型時,盡量使用一些性能優良的組件。比如,在進行網絡開發時,盡量選擇Netty,結合輕量級的數據傳輸,就不要使用WebService等技術了。
很多公司喜歡使用適配器模式,在一些現有的開源組件之上,再抽象一層自己的組件,這樣就能夠做到切換底層組件的時候,對上層應用無感。
到此,相信大家對“怎么做性能優化”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。