這篇文章給大家分享的是有關(guān)Java性能調(diào)優(yōu)的實(shí)用技巧有哪些的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
成都創(chuàng)新互聯(lián)公司制作網(wǎng)站網(wǎng)頁(yè)找三站合一網(wǎng)站制作公司,專(zhuān)注于網(wǎng)頁(yè)設(shè)計(jì),做網(wǎng)站、網(wǎng)站設(shè)計(jì),網(wǎng)站設(shè)計(jì),企業(yè)網(wǎng)站搭建,網(wǎng)站開(kāi)發(fā),建網(wǎng)站業(yè)務(wù),680元做網(wǎng)站,已為1000+服務(wù),成都創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)將一如既往的為我們的客戶提供最優(yōu)質(zhì)的網(wǎng)站建設(shè)、網(wǎng)絡(luò)營(yíng)銷(xiāo)推廣服務(wù)!
1.在必要之前,先不要優(yōu)化
這可能是最最重要的性能調(diào)優(yōu)技巧之一。你應(yīng)該遵循常見(jiàn)的最佳實(shí)踐,并嘗試有效地實(shí)現(xiàn)你的用例。但這并不意味著在證明它是必要之前,替換任何標(biāo)準(zhǔn)庫(kù)或構(gòu)建復(fù)雜的優(yōu)化。
在大多數(shù)情況下,過(guò)早的優(yōu)化占用了大量的時(shí)間,使得代碼難以讀取和維護(hù)。更糟糕的是,這些優(yōu)化通常不會(huì)帶來(lái)任何好處,因?yàn)槟慊ㄙM(fèi)了大量時(shí)間來(lái)優(yōu)化應(yīng)用程序的非關(guān)鍵部分。
那么,你如何證明你需要優(yōu)化某些東西呢?
首先,你需要確定應(yīng)用程序代碼的速度,例如,為所有API調(diào)用指定一個(gè)最大響應(yīng)時(shí)間,或者指定在特定時(shí)間范圍內(nèi)導(dǎo)入的記錄數(shù)量。完成之后,你可以度量應(yīng)用程序的哪些部分太慢而需要改進(jìn)。當(dāng)這樣做之后,那么請(qǐng)繼續(xù)看第二個(gè)調(diào)優(yōu)技巧。
2.使用分析器來(lái)找到真正的瓶頸
在你遵循第一條建議,并確定你的應(yīng)用程序的某些部分的確需要改進(jìn)之后,問(wèn)自己從哪里開(kāi)始?
你可以用兩種方法來(lái)解決這個(gè)問(wèn)題:
你可以看一下你的代碼,從看起來(lái)可疑或者你覺(jué)得它可能會(huì)產(chǎn)生問(wèn)題的部分開(kāi)始。
或者使用分析器,獲取代碼中每個(gè)部分的行為和性能的詳細(xì)信息。
至于為什么應(yīng)該總是遵循第二種方法。
答案應(yīng)該很明顯,基于分析器的方法能讓你更好地理解代碼的性能含義,并允許你關(guān)注最關(guān)鍵的部分。如果你曾經(jīng)使用過(guò)分析器,你將會(huì)驚訝于代碼的哪些部分造成了性能問(wèn)題。然而,很多時(shí)候,你的第一次猜想會(huì)把你引向錯(cuò)誤的方向。
3 .為整個(gè)應(yīng)用程序創(chuàng)建性能測(cè)試套件
這是另一個(gè)幫助你避免許多意想不到問(wèn)題的一般技巧,這些問(wèn)題通常發(fā)生在性能改進(jìn)部署到生產(chǎn)環(huán)境之后。你應(yīng)該經(jīng)常定義測(cè)試整個(gè)應(yīng)用程序的性能測(cè)試套件,并在你完成性能改進(jìn)之前和之后運(yùn)行它。
這些額外的測(cè)試運(yùn)行將幫助你識(shí)別更改的功能和性能方面的影響,并確保你不會(huì)發(fā)布一個(gè)弊大于利的更新。如果你的任務(wù)運(yùn)行于應(yīng)用程序的多個(gè)不同部分比如數(shù)據(jù)庫(kù)或緩存,這一點(diǎn)尤其重要。
4.首先解決最大的瓶頸問(wèn)題
在創(chuàng)建了測(cè)試套件并使用分析器對(duì)應(yīng)用程序進(jìn)行分析之后,你就有了一個(gè)需要提高性能的問(wèn)題列表,這很好,但它仍然不能回答你應(yīng)該從哪里開(kāi)始的問(wèn)題。你可以從那些可以快速搞定的開(kāi)始,亦或者從最重要的問(wèn)題開(kāi)始。
當(dāng)然前者很誘人,因?yàn)檫@很快就能出結(jié)果。有時(shí),可能需要說(shuō)服其他團(tuán)隊(duì)成員或你的管理層,性能分析是值得的。
但總的來(lái)說(shuō),我建議首先著手處理最重要的性能問(wèn)題。這將為你提供最大的性能改進(jìn),而且你可能只需要修復(fù)這些問(wèn)題中的幾個(gè)就可以解決你的性能需求。
在了解通用性能調(diào)優(yōu)技巧之后,讓我們?cè)賮?lái)仔細(xì)看看一些特定于Java的調(diào)優(yōu)技巧。
5.使用StringBuilder以編程方式連接字符串
在Java中有許多不同的連接字符串的選項(xiàng)。例如,可以使用一個(gè)簡(jiǎn)單的+或+ =、老的StringBuffer或StringBuilder。
那么,你應(yīng)該選擇哪種方法呢?
答案取決于連接字符串的代碼。如果你以編程方式向字符串中添加新內(nèi)容,例如,在for循環(huán)中,你應(yīng)該使用StringBuilder。它比StringBuffer更容易使用和提供更好的性能。但是請(qǐng)記住,StringBuilder與StringBuffer不同,它不是線程安全的,而且可能不適合所有用例。
你只需要實(shí)例化一個(gè)新的StringBuilder,并調(diào)用append方法在字符串中添加一個(gè)新的部分。當(dāng)你添加了所有的部分后,可以調(diào)用toString()方法來(lái)檢索連接字符串。
下面的代碼片段展示了一個(gè)簡(jiǎn)單的示例。在每次迭代過(guò)程中,這個(gè)循環(huán)將i轉(zhuǎn)換成一個(gè)字符串,并將其添加到StringBuilder sb的空間中,因此到最后,這段代碼寫(xiě)入“this is test0123456789”到日志文件。
StringBuilder sb = new StringBuilder(“This is a test”); for (int i=0; i<10; i++) { sb.append(i); sb.append(” “); } log.info(sb.toString());
正如在代碼片段中看到的,你可以為構(gòu)造函數(shù)方法提供字符串的第一個(gè)元素。這將創(chuàng)建一個(gè)新的StringBuilder,其中包含提供的字符串和16個(gè)額外字符的容量。當(dāng)你向StringBuilder中添加更多字符時(shí),JVM將動(dòng)態(tài)地改變StringBuilder的大小。
如果你已經(jīng)知道自己的字符串包含多少字符,那么你可以向不同的構(gòu)造函數(shù)方法提供這個(gè)數(shù)字,以實(shí)例化一個(gè)具有被定義容量的StringBuilder。這進(jìn)一步提高了它的效率,因?yàn)樗恍枰獎(jiǎng)討B(tài)擴(kuò)展它的容量。
6.在聲明中使用+連接字符串
當(dāng)你在Java中實(shí)現(xiàn)第一個(gè)應(yīng)用程序時(shí),可能有人告訴你不應(yīng)該用+來(lái)連接字符串。如果在應(yīng)用程序邏輯中連接字符串這是正確的。字符串是不可變的,每個(gè)字符串連接的結(jié)果存儲(chǔ)在一個(gè)新的字符串對(duì)象中。這需要額外的內(nèi)存,并降低應(yīng)用程序的速度,特別是在循環(huán)中連接多個(gè)字符串時(shí)。
在這些情況下,你應(yīng)該遵循tip 5并使用StringBuilder。
但如果你只是將一個(gè)字符串分解成多行來(lái)提高代碼的可讀性,那就不是這樣了。
Query q = em.createQuery(“SELECT a.id, a.firstName, a.lastName ” + “FROM Author a ” + “WHERE a.id = :id”);
在這些情況下,你應(yīng)該用一個(gè)簡(jiǎn)單的+來(lái)連接你的字符串。Java編譯器將優(yōu)化它并在編譯時(shí)執(zhí)行連接。因此,在運(yùn)行時(shí),代碼只使用1個(gè)字符,不需要連接。
7.盡可能使用基本數(shù)據(jù)類(lèi)型
另一種避免開(kāi)銷(xiāo),提高應(yīng)用程序性能的快速方法就是使用原始數(shù)據(jù)類(lèi)型而不是它們的包裝類(lèi)。因此,最好是使用int而不是Integer,或者是double而不是Double。這將讓JVM將值存儲(chǔ)在堆棧中,以減少內(nèi)存消耗,并更有效地處理它。
8.盡量避免BigInteger和BigDecimal
由于我們已經(jīng)討論了數(shù)據(jù)類(lèi)型,我們?cè)賮?lái)看下BigInteger和BigDecimal。尤其是后者,由于其精度高而受歡迎。但這是有代價(jià)的。
BigInteger和BigDecimal比簡(jiǎn)單的long或double需要更多的內(nèi)存,并且大大降低所有的計(jì)算速度。因此,如果你需要額外的精度,或者你的數(shù)字超過(guò)了一個(gè)long范圍,最好三思而后行。這可能是你在提升性能問(wèn)題中唯一需要更改的地方,特別是當(dāng)你正在實(shí)現(xiàn)一個(gè)數(shù)學(xué)算法。
9.首先檢查當(dāng)前日志級(jí)別
這個(gè)建議是顯而易見(jiàn)的,但不幸的是,你會(huì)發(fā)現(xiàn)許多代碼忽略它。在創(chuàng)建調(diào)試消息之前,應(yīng)該先檢查當(dāng)前日志級(jí)別。
這里有兩個(gè)例子來(lái)說(shuō)明你不應(yīng)該這樣做。
// don't do this log.debug(“User [” + userName + “] called method X with [” + i + “]”); // or this log.debug(String.format(“User [%s] called method X with [%d]”, userName, i));
在這兩種情況下,你將執(zhí)行所有需要的步驟來(lái)創(chuàng)建日志消息,而不知道日志框架是否使用日志消息。在創(chuàng)建調(diào)試消息之前,最好先檢查當(dāng)前日志級(jí)別。
10.使用Apache Commons StringUtils.Replace 代替String.replace
一般來(lái)說(shuō),String.replace 方法工作得很好,而且非常高效,特別是如果你使用的是Java 9。但是,如果應(yīng)用程序需要大量的替換操作,并且你還沒(méi)有更新到最新的Java版本,那么檢查更快和更有效的替代方案仍然是有意義的。
一個(gè)候選就是 Apache Commons Lang's StringUtils.replace 方法。正如Lukas Eder在他最近的一篇博客文章中所描述的那樣,它大大超過(guò)了Java 8的String.replace 方法。
它只需要很小的改變。你只需要為Apache's Commons Lang 項(xiàng)目增加一個(gè)Maven依賴(lài)項(xiàng)到你的應(yīng)用pom.xml,并用StringUtils.replace方法替換所有String.replace方法的調(diào)用。
// replace this test.replace(“test”, “simple test”); // with this StringUtils.replace(test, “test”, “simple test”);
11.緩存昂貴的資源,比如數(shù)據(jù)庫(kù)連接
緩存是一種流行的解決方案來(lái)避免重復(fù)執(zhí)行昂貴或頻繁使用的代碼片段。一般的想法很簡(jiǎn)單:重復(fù)使用這些資源比一次又一次地創(chuàng)建一個(gè)新的資源要便宜得多。
一個(gè)典型的例子就是在池中緩存數(shù)據(jù)庫(kù)連接。創(chuàng)建新連接需要時(shí)間,如果重用現(xiàn)有連接,則可以避免。
還可以在Java語(yǔ)言本身中找到其他示例。例如,Integer類(lèi)的valueOf方法緩存了- 128和127之間的值。你可能會(huì)說(shuō),創(chuàng)建一個(gè)新整數(shù)并不太貴,但它經(jīng)常使用,緩存最常用的值提供了性能方面的好處。
但當(dāng)你考慮緩存時(shí),請(qǐng)記住,緩存實(shí)現(xiàn)也會(huì)產(chǎn)生開(kāi)銷(xiāo)。你需要花費(fèi)額外的內(nèi)存來(lái)存儲(chǔ)可重用資源,因此可能需要管理你的緩存,以使資源能夠訪問(wèn)或刪除過(guò)時(shí)的資源。
因此,在你開(kāi)始緩存任何資源之前,請(qǐng)確保是經(jīng)常使用。
感謝各位的閱讀!關(guān)于“Java性能調(diào)優(yōu)的實(shí)用技巧有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
標(biāo)題名稱(chēng):Java性能調(diào)優(yōu)的實(shí)用技巧有哪些
標(biāo)題路徑:http://aaarwkj.com/article30/gjohso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、電子商務(wù)、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站排名、云服務(wù)器、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)