摘要:這個寫法常常成為系統的瓶頸,如果這個地方恰好是一個性能瓶頸,修改成之后,性能會有大幅的提升。
性能優化的理念
粗略地劃分,代碼可分為 cpu consuming 和 io consuming 兩種類型,即耗 CPU 的和耗 IO 的代碼。如果當前CPU已經能夠接近100%的利用率, 并且代碼業務邏輯無法再簡化, 那么說明該系統的已經達到了性能最大化, 如果再想提高性能, 只能增加處理器(增加更多的機器或者安裝更多的CPU)。
而耗 IO 的代碼,一般體現為請求某種資源,這可以是訪問數據庫,或者訪問網絡對端。
評價程序寫得好不好,要看隨著訪問壓力的上升,CPU 使用率的變化,好的代碼,隨著訪問壓力的上升,CPU 的使用率最終能趨近100%,而壞的代碼,使用率始終無法趨近 100%,有可能在 70% 就已經上不去了。好的代碼應該在代碼本身效率足夠高的情況下,通過使用并發等手段,讓 CPU 的盡量地忙起來。隨著訪問壓力的上升,CPU 使用率也上升,并且 CPU 所跑的代碼都是已經無法再進行邏輯優化或者效率提升的代碼,這是最理想的狀態。
常見性能瓶頸 多余的同步不相關的兩個函數, 共用了一個鎖,或者不同的共享變量共用了同一個鎖, 無謂地制造出了資源爭用,如下代碼所示:
class MyClass { Object sharedObj; synchronized void fun1() {...} //訪問共享變量sharedObj synchronized void fun2() {...} //訪問共享變量sharedObj synchronized void fun3() {...} //不訪問共享變量sharedObj synchronized void fun4() {...} //不訪問共享變量sharedObj synchronized void fun5() {...} //不訪問共享變量sharedObj }
上面的代碼將sychronized加在類的每一個方法上面, 違背了保護什么鎖什么的原則。對于無共享資源的兩個方法, 使用了同一個鎖, 人為造成了不必要的鎖等待。 上述的代碼可作如下修改:
class MyClass { Object sharedObj; synchronized void fun1() {...} //訪問共享變量sharedObj synchronized void fun2() {...} //訪問共享變量sharedObj void fun3() {...} //不訪問共享變量sharedObj void fun4() {...} //不訪問共享變量sharedObj void fun5() {...} //不訪問共享變量sharedObj }鎖粒度過大
對共享資源訪問完成后, 沒有將后續的代碼放在synchronized同步代碼塊之外。 這樣會導致當前線程長時間無謂的占有該鎖, 其它爭用該鎖的線程只能等待, 最終導致性能受到極大影響。如下代碼所示:
void fun1() { synchronized(lock){ ... ... //正在訪問共享資源 ... ... //做其它耗時操作,但這些耗時操作與共享資源無關 } }
上面的代碼, 會導致一個線程過長地占有鎖, 而在這么長的時間里其它線程只能等待。應將上述代碼作如下修改,在多 CPU 的環境中,可獲得性能的提升:
void fun1() { synchronized(lock) { ... ... //正在訪問共享資源 } ... ... //其它耗時操作代碼拿到synchronized代碼外面 }字符串連接的濫用
String c = new String("abc") + new String("efg") + new String("12345");
每一次+操作都會產生一個臨時對象, 并伴隨著數據拷貝, 這個對性能是一個極大的消耗。 這個寫法常常成為系統的瓶頸, 如果這個地方恰好是一個性能瓶頸, 修改成StringBuffer之后, 性能會有大幅的提升。
不恰當的線程模型在多線程場合下, 如果線程模型不恰當, 也會使性能低下,在網絡IO的場合, 使用消息發送隊列和消息接收隊列來進行異步IO,性能會有顯著的提升。
不恰當的GC參數設置會導致嚴重的性能問題,比如堆內存設置過小導致大量的 CPU 時間片被用來做垃圾回收
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69919.html
摘要:線程的優先級代表線程的優先級為線程代表線程為,而代表該線程對應的操作系統級別的線程。若是有運行圖形界面的環境,也可以使用一些圖形化的工具,例如來生成線程棧文件。使用線程棧定位問題發現死鎖當兩個或多個線程正在等待被對方占有的鎖,死鎖就會發生。 什么是線程棧(thread dump) 線程棧是某個時間點,JVM所有線程的活動狀態的一個匯總;通過線程棧,可以查看某個時間點,各個線程正在做什么...
摘要:萬眾矚目的開源免費代碼部署平臺,終于出預覽版了。驚艷無比,一系列大家無比期待的逐一亮相,代碼發布終于可以不只能選擇,有了一個可自由配置項目,更人性化,支持多用戶多項目多環境同時部署的開源上線部署系統。 萬眾矚目的開源免費代碼部署平臺 walle 2.0,終于出預覽版了。walle 2.0 驚艷無比,一系列大家無比期待的 Feature 逐一亮相,代碼發布終于可以不只能選擇 jenkin...
摘要:用動態規劃決定連接的執行順序,當參與連接的表數量不多于時啟用。在邏輯優化階段消除聚合函數時特殊處理,防止產生錯誤的執行結果。該特性通過對進行執行計劃綁定,以確保執行穩定性。執行引擎支持對和算子進行內存追蹤控制。 2019 年 5 月 10 日,TiDB 發布 3.0.0-rc.1 版,對應的 TiDB-Ansible 版本為 3.0.0-rc.1。相比 3.0.0-beta.1 版本,...
摘要:主題大綱淺述采樣與端到端何為何為端到端何為采樣的做法與弊端嘉賓介紹高馳濤,官方開發組成員,作者,云智慧高級架構師。 極牛技術實踐分享活動 極牛技術實踐分享系列活動是極牛聯合頂級VC、技術專家,為企業、技術人提供的一種系統的線上技術分享活動。 每期不同的技術主題,和行業專家深度探討,專注解決技術實踐難點,推動技術創新,每兩周的周三20點正式開課。歡迎各個機構、企業、行業專家、技術人...
閱讀 2404·2021-11-23 09:51
閱讀 1217·2021-11-22 13:54
閱讀 3427·2021-09-24 10:31
閱讀 1089·2021-08-16 10:46
閱讀 3627·2019-08-30 15:54
閱讀 707·2019-08-30 15:54
閱讀 2888·2019-08-29 17:17
閱讀 3162·2019-08-29 15:08