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