1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        9 個(gè) Java 性能調(diào)優(yōu)技巧,YYDS!

        共 4270字,需瀏覽 9分鐘

         ·

        2022-07-09 06:53

        程序員的成長(zhǎng)之路
        互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享 
        關(guān)注


        閱讀本文大概需要 6 分鐘。

        來(lái)自:dzone.com/articles/11-simple-java-performance-tuning-tips

        大多數(shù)開發(fā)者認(rèn)為性能優(yōu)化是一個(gè)復(fù)雜的話題,它需要大量的工作經(jīng)驗(yàn)和相關(guān)知識(shí)理論。好吧,這也不完全錯(cuò)。優(yōu)化一個(gè)應(yīng)用做到性能最優(yōu)化可能不是件容易的任務(wù),但是這并不意味著你沒有相關(guān)的知識(shí)就什么也做不了。這里有一些易于遵循的建議和最佳實(shí)踐可以幫助你創(chuàng)建一個(gè)性能良好的應(yīng)用程序。
        這些建議的大部分都是針對(duì) Java 語(yǔ)言的。但是也有一些是跟語(yǔ)言無(wú)關(guān)的,你可以運(yùn)用到任意的應(yīng)用和程序中。在我們學(xué)習(xí)特定的 Java 編程性能調(diào)優(yōu)之前,先來(lái)探討一些通用的技巧。

        1. 在明確必要之前別急著優(yōu)化

        這可能是最重要的性能優(yōu)化技巧之一。你應(yīng)該遵循常見的最佳實(shí)踐做法并在案例中高效地應(yīng)用它。但是這并不意味在證明必要之前,你應(yīng)該更換任何標(biāo)準(zhǔn)庫(kù)或構(gòu)建復(fù)雜的優(yōu)化。
        多數(shù)情況下,過(guò)早地優(yōu)化會(huì)占用大量的時(shí)間,而且會(huì)使代碼變得難以理解和閱讀。更糟糕的是,這些優(yōu)化通常并沒帶來(lái)任何好處,因?yàn)槟慊舜罅康臅r(shí)間在優(yōu)化應(yīng)用中的非關(guān)鍵部分。
        那么,要怎么證明東西需要優(yōu)化呢?
        首先,你需要定義你的代碼速度得多快。例如,為所有 API 調(diào)用指定最大響應(yīng)時(shí)間,或者指定在特定時(shí)間范圍內(nèi)要導(dǎo)入的記錄數(shù)量。在做完這些后,你需要確定你應(yīng)用中哪些部分太慢需要改進(jìn)。當(dāng)完成這些后,你就可以來(lái)看看第二個(gè)技巧提示。

        2. 使用分析器找到真正的瓶頸

        在完成第一部分的優(yōu)化建議以鑒別出你應(yīng)用中需要提升的部分后,要從哪里入手呢?
        你可以有兩種途徑來(lái)解決這個(gè)問(wèn)題:
        1. 查看你的代碼,從看起來(lái)可疑的或者你覺得可能會(huì)導(dǎo)致出現(xiàn)問(wèn)題的地方入手。
        2. 或者使用分析器獲取代碼每個(gè)部分的行為(執(zhí)行過(guò)程)和性能的詳細(xì)信息。
        希望我不需要解釋為什么應(yīng)該始終遵循第二種途徑/方法的原因。
        很顯然,基于分析器的方式可以讓你更好地理解代碼的性能影響,并允許你去專注于更關(guān)鍵的部分(代碼)。即使你曾經(jīng)使用過(guò)分析器,你一定記得你曾經(jīng)多么驚訝于一下就找到了代碼的哪些部分產(chǎn)生了性能問(wèn)題。我第一次的猜測(cè)不止一次地導(dǎo)致我走錯(cuò)了方向。

        3. 為整個(gè)應(yīng)用程序創(chuàng)建一個(gè)性能測(cè)試套件

        這是另一個(gè)通用的可以幫助你避免在將性能改進(jìn)部署到產(chǎn)品中之后經(jīng)常會(huì)發(fā)生的許多意外問(wèn)題的技巧。你應(yīng)該總是定義一個(gè)性能測(cè)試套件來(lái)測(cè)試整個(gè)應(yīng)用程序,并在性能改進(jìn)之前和之后運(yùn)行它。
        這些額外的測(cè)試運(yùn)行將幫助你識(shí)別你的改動(dòng)所引起的功能和性能上的副作用,并確保不會(huì)導(dǎo)致弊大于利的更新。如果你處理的是被應(yīng)用程序的多個(gè)不同部分使用的組件,如數(shù)據(jù)庫(kù)或緩存,那這一點(diǎn)尤為重要。

        4. 優(yōu)先關(guān)注最大瓶頸

        在創(chuàng)建了測(cè)試套件并使用分析器分析你的應(yīng)用程序之后,你可以列出一系列需要解決以提高性能的問(wèn)題列表。這很好,但這并沒有回答你需要從哪里開始的問(wèn)題。你可以專注于速成方案,或從最重要的問(wèn)題開始。
        速成方案一開始可能會(huì)很有吸引力,因?yàn)槟憧梢院芸祜@示第一個(gè)成果。但有時(shí),可能有必要說(shuō)服其他團(tuán)隊(duì)成員或管理層認(rèn)為性能分析是值得的。
        一般來(lái)說(shuō),我建議從頂層開始,首先開始處理最重要的性能問(wèn)題。這將為你提供最大的性能改進(jìn),而且你可能僅需要解決這些問(wèn)題中的一小部分就能滿足你的性能要求。
        常見的通用調(diào)優(yōu)技巧到此結(jié)束。接下來(lái)讓我們仔細(xì)看看一些特定于 Java 的技巧。

        5. 使用 StringBuilder 以編程方式連接字符串

        在 Java 中有很多不同的選項(xiàng)來(lái)連接字符串。例如,你可以使用簡(jiǎn)單的 + 或 + = ,以及老的 StringBuffer 或 StringBuilder 。
        那么,你應(yīng)該選擇哪種方法呢?
        答案取決于連接字符串的代碼。如果你是以編程方式將新內(nèi)容添加到字符串中,例如在for循環(huán)中,則應(yīng)使用 StringBuilder 。它很易于使用,并提供比 StringBuffer 更好的性能。但請(qǐng)記住,與 StringBuffer 相比, StringBuilder 不是線程安全的,可能并不適用于所有情況。
        你只需要實(shí)例化一個(gè)新的 StringBuilder 并調(diào)用append方法來(lái)向String中添加一個(gè)新的部分。在你添加完了所有的部分后,你可以調(diào)用toString()方法來(lái)檢索已連接的字符串。 下面的代碼片段展示了一個(gè)簡(jiǎn)單的例子。在每次迭代期間,該循環(huán)將 i 轉(zhuǎn)換為一個(gè) String ,并將其與空格一起添加到 StringBuilder sb 中。所以,最后,這段代碼在日志文件中寫入 “This is a test0 1 2 3 4 5 6 7 8 9” 。

        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è)元素提供到構(gòu)造函數(shù)中。這會(huì)創(chuàng)建一個(gè) StringBuilder ,其中包含了你所提供的字符串以及 16 個(gè)額外字符的容量。當(dāng)你向 StringBuilder 中添加更多字符時(shí),你的 JVM 將動(dòng)態(tài)的增加 StringBuilder 的大小。
        如果你已經(jīng)知道字符串將包含多少個(gè)字符,則可以將該數(shù)字提供給不同的構(gòu)造方法以實(shí)例化具有指定容量的 StringBuilder 。這進(jìn)一步提高了效率,因?yàn)樗恍枰獎(jiǎng)討B(tài)擴(kuò)展其容量。

        6. 盡可能使用基本類型

        避免任何開銷并提高應(yīng)用程序性能的另一種簡(jiǎn)便快速的方法是使用基本類型而不是其包裝類。所以,最好使用 int 而不是 Integer ,是 double 而不是 Double 。這將使得你的 JVM 將值存儲(chǔ)在堆棧而不是堆中,以減少內(nèi)存消耗,并更有效地處理它。

        7. 盡量避免大整數(shù)和小數(shù)

        由于我們已經(jīng)在討論數(shù)據(jù)類型,所以我們也應(yīng)該快速瀏覽大整數(shù)和小數(shù)。尤其是后者因其精確性而受歡迎。但這是有代價(jià)的。 大整數(shù)和小數(shù)比一個(gè)簡(jiǎn)單的 long 型或 double 型需要更多的內(nèi)存,并會(huì)顯著減慢所有的運(yùn)算。所以,如果你需要額外的精度,或者如果你的數(shù)字超出一個(gè)較長(zhǎng)的范圍,最好要三思。這可能是你需要更改并解決性能問(wèn)題的唯一方法,尤其是在實(shí)現(xiàn)數(shù)學(xué)算法時(shí)。

        8. 使用 Apache Commons StringUtils.Replace 而不是 String.replace

        一般來(lái)說(shuō),String.replace 方法可以正常工作,并且效率很高,尤其是在你使用 Java 9 的情況下。但是,如果你的應(yīng)用程序需要大量的替換操作,并且沒有更新到最新的 Java 版本,那么檢查更快和更有效的替代品依然是有必要的。
        有一種候選方案是 Apache Commons Lang 的 StringUtils.replace 方法。正如 Lukas Eder 在他最近的一篇博客文章中所描述的,它遠(yuǎn)遠(yuǎn)勝過(guò)了 Java 8 的 String.replace 方法。
        而且它只需要很小的改動(dòng)。你只需要將 Apache Commons Lang 項(xiàng)目的 Maven 依賴項(xiàng)添加到你的應(yīng)用程序的 pom.xml 中,并將 String.replacemethod 的所有調(diào)用替換為 StringUtils.replace 方法。

        // replace this
        test.replace(“test”, “simple test”);
        // with this
        StringUtils.replace(test, “test”, “simple test”);

        9. 昂貴的緩存資源,如數(shù)據(jù)庫(kù)連接

        緩存是避免重復(fù)執(zhí)行昂貴或常用代碼片段的流行解決方案??偟乃悸泛芎?jiǎn)單:重復(fù)使用這些資源比創(chuàng)建一個(gè)新的資源更劃算。
        一個(gè)典型的例子是緩存池中的數(shù)據(jù)庫(kù)連接。新連接的創(chuàng)建需要時(shí)間,如果你重用現(xiàn)有連接,則可以避免這種情況。
        你也可以在 Java 語(yǔ)言源碼中找到其他的例子。例如,在 Integer 類中的 valueOf  方法緩存了介于 -128 到 127 之間的值。你可能會(huì)說(shuō)創(chuàng)建一個(gè)新的 Integer 并不是太昂貴,但是由于它經(jīng)常被使用,因此緩存最常用的值也可以提供性能優(yōu)勢(shì)。
        但是,當(dāng)你考慮使用緩存時(shí),請(qǐng)記住緩存實(shí)現(xiàn)也會(huì)產(chǎn)生開銷。你需要花費(fèi)額外的內(nèi)存來(lái)儲(chǔ)存可重復(fù)使用的資源,因此你可能需要管理你的緩存以使資源可訪問(wèn),并刪除過(guò)期的資源。
        所以,在開始緩存任何資源之前,請(qǐng)確保它們是經(jīng)常使用的,以超過(guò)緩存實(shí)現(xiàn)的開銷(代價(jià))。

        總結(jié)

        正如你所看到的,有時(shí)不需要太多的工作就可以提高你的應(yīng)用程序的性能。本文中的大部分建議只需要稍作努力就可以將它們應(yīng)用于你的代碼中。
        但還是那句話,最重要的還是那些與是什么編程語(yǔ)言無(wú)關(guān)的技巧:
        • 在你知道其必要性之前不要進(jìn)行優(yōu)化
        • 使用分析器(profiler)來(lái)查找真正的瓶
        • 優(yōu)先處理最大的瓶頸
        <END>
        推薦閱讀:

        CentOS 停服!我們有哪些頂流的國(guó)產(chǎn)操作系統(tǒng)

        如何快速過(guò)濾出一次請(qǐng)求的所有日志?

        互聯(lián)網(wǎng)初中高級(jí)大廠面試題(9個(gè)G)

        內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬(wàn)并發(fā)、消息隊(duì)列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper......等技術(shù)棧!

        ?戳閱讀原文領(lǐng)?。?/span>                                  朕已閱 

        瀏覽 43
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            日本三级视频在线 | 快点快点进去进去好爽 | 一级国产黄色视频 | 被领导糟蹋娇妻好紧好爽小说 | 少妇精品导航 | 好看的印度三色电费 | 你观看最新操逼视频 | 久久久成人高清视频 | 91人妻人人操 | sese在线 |