亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

分享Java性能調優的11個實用技巧

2024-07-13 10:13:27
字體:
來源:轉載
供稿:網友

大多數開發人員認為性能優化是個比較復雜的問題,需要大量的經驗和知識。是的,這并不沒有錯。誠然,優化應用程序以獲得最好的性能并不是一件容易的事情,但這并不意味著你在沒有獲得這些經驗和知識之前就不能做任何事。下面有幾個很容易遵循的建議和最佳實踐能夠幫你創建一個性能良好的應用程序。

這些建議中的大多數都是基于Java的,但是也不一定,也有一些是可以應用于所有的應用程序和編程語言的。在我們分享基于Java的性能調優技巧之前,讓我們先討論一下這些通用的性能調優技巧。

1.在必要之前,先不要優化

這可能是最最重要的性能調優技巧之一。你應該遵循常見的最佳實踐,并嘗試有效地實現你的用例。但這并不意味著在證明它是必要之前,替換任何標準庫或構建復雜的優化。

在大多數情況下,過早的優化占用了大量的時間,使得代碼難以讀取和維護。更糟糕的是,這些優化通常不會帶來任何好處,因為你花費了大量時間來優化應用程序的非關鍵部分。

那么,你如何證明你需要優化某些東西呢?

首先,你需要確定應用程序代碼的速度,例如,為所有API調用指定一個最大響應時間,或者指定在特定時間范圍內導入的記錄數量。完成之后,你可以度量應用程序的哪些部分太慢而需要改進。當這樣做之后,那么請繼續看第二個調優技巧。

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

在你遵循第一條建議,并確定你的應用程序的某些部分的確需要改進之后,問自己從哪里開始?

你可以用兩種方法來解決這個問題:

  1. 你可以看一下你的代碼,從看起來可疑或者你覺得它可能會產生問題的部分開始。
  2. 或者使用分析器,獲取代碼中每個部分的行為和性能的詳細信息。

至于為什么應該總是遵循第二種方法。

答案應該很明顯,基于分析器的方法能讓你更好地理解代碼的性能含義,并允許你關注最關鍵的部分。如果你曾經使用過分析器,你將會驚訝于代碼的哪些部分造成了性能問題。然而,很多時候,你的第一次猜想會把你引向錯誤的方向。

3 .為整個應用程序創建性能測試套件

這是另一個幫助你避免許多意想不到問題的一般技巧,這些問題通常發生在性能改進部署到生產環境之后。你應該經常定義測試整個應用程序的性能測試套件,并在你完成性能改進之前和之后運行它。

這些額外的測試運行將幫助你識別更改的功能和性能方面的影響,并確保你不會發布一個弊大于利的更新。如果你的任務運行于應用程序的多個不同部分比如數據庫或緩存,這一點尤其重要。

4.首先解決最大的瓶頸問題

在創建了測試套件并使用分析器對應用程序進行分析之后,你就有了一個需要提高性能的問題列表,這很好,但它仍然不能回答你應該從哪里開始的問題。你可以從那些可以快速搞定的開始,亦或者從最重要的問題開始。

當然前者很誘人,因為這很快就能出結果。有時,可能需要說服其他團隊成員或你的管理層,性能分析是值得的。

但總的來說,我建議首先著手處理最重要的性能問題。這將為你提供最大的性能改進,而且你可能只需要修復這些問題中的幾個就可以解決你的性能需求。

在了解通用性能調優技巧之后,讓我們再來仔細看看一些特定于Java的調優技巧。

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

在Java中有許多不同的連接字符串的選項。例如,可以使用一個簡單的+或+ =、老的StringBuffer或StringBuilder。 

那么,你應該選擇哪種方法呢? 

答案取決于連接字符串的代碼。如果你以編程方式向字符串中添加新內容,例如,在for循環中,你應該使用StringBuilder。它比StringBuffer更容易使用和提供更好的性能。但是請記住,StringBuilder與StringBuffer不同,它不是線程安全的,而且可能不適合所有用例。 

你只需要實例化一個新的StringBuilder,并調用append方法在字符串中添加一個新的部分。當你添加了所有的部分后,可以調用toString()方法來檢索連接字符串。 

下面的代碼片段展示了一個簡單的示例。在每次迭代過程中,這個循環將i轉換成一個字符串,并將其添加到StringBuilder sb的空間中,因此到最后,這段代碼寫入“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());

正如在代碼片段中看到的,你可以為構造函數方法提供字符串的第一個元素。這將創建一個新的StringBuilder,其中包含提供的字符串和16個額外字符的容量。當你向StringBuilder中添加更多字符時,JVM將動態地改變StringBuilder的大小。

如果你已經知道自己的字符串包含多少字符,那么你可以向不同的構造函數方法提供這個數字,以實例化一個具有被定義容量的StringBuilder。這進一步提高了它的效率,因為它不需要動態擴展它的容量。

6.在聲明中使用+連接字符串

當你在Java中實現第一個應用程序時,可能有人告訴你不應該用+來連接字符串。如果在應用程序邏輯中連接字符串這是正確的。字符串是不可變的,每個字符串連接的結果存儲在一個新的字符串對象中。這需要額外的內存,并降低應用程序的速度,特別是在循環中連接多個字符串時。

在這些情況下,你應該遵循tip 5并使用StringBuilder。

但如果你只是將一個字符串分解成多行來提高代碼的可讀性,那就不是這樣了。

Query q = em.createQuery(“SELECT a.id, a.firstName, a.lastName ”+ “FROM Author a ”+ “WHERE a.id = :id”);

在這些情況下,你應該用一個簡單的+來連接你的字符串。Java編譯器將優化它并在編譯時執行連接。因此,在運行時,代碼只使用1個字符,不需要連接。

7.盡可能使用基本數據類型

另一種避免開銷,提高應用程序性能的快速方法就是使用原始數據類型而不是它們的包裝類。因此,最好是使用int而不是Integer,或者是double而不是Double。這將讓JVM將值存儲在堆棧中,以減少內存消耗,并更有效地處理它。

8.盡量避免BigInteger和BigDecimal

由于我們已經討論了數據類型,我們再來看下BigInteger和BigDecimal。尤其是后者,由于其精度高而受歡迎。但這是有代價的。 
BigInteger和BigDecimal比簡單的long或double需要更多的內存,并且大大降低所有的計算速度。因此,如果你需要額外的精度,或者你的數字超過了一個long范圍,最好三思而后行。這可能是你在提升性能問題中唯一需要更改的地方,特別是當你正在實現一個數學算法。 

9.首先檢查當前日志級別

這個建議是顯而易見的,但不幸的是,你會發現許多代碼忽略它。在創建調試消息之前,應該先檢查當前日志級別。

這里有兩個例子來說明你不應該這樣做。

// don't do thislog.debug(“User [” + userName + “] called method X with [” + i + “]”);// or thislog.debug(String.format(“User [%s] called method X with [%d]”, userName, i));

在這兩種情況下,你將執行所有需要的步驟來創建日志消息,而不知道日志框架是否使用日志消息。在創建調試消息之前,最好先檢查當前日志級別。

10.使用Apache Commons StringUtils.Replace 代替String.replace

一般來說,String.replace 方法工作得很好,而且非常高效,特別是如果你使用的是Java 9。但是,如果應用程序需要大量的替換操作,并且你還沒有更新到最新的Java版本,那么檢查更快和更有效的替代方案仍然是有意義的。

一個候選就是 Apache Commons Lang's StringUtils.replace 方法。正如Lukas Eder在他最近的一篇博客文章中所描述的那樣,它大大超過了Java 8的String.replace 方法。 

它只需要很小的改變。你只需要為Apache's Commons Lang 項目增加一個Maven依賴項到你的應用pom.xml,并用StringUtils.replace方法替換所有String.replace方法的調用。 

// replace thistest.replace(“test”, “simple test”);// with thisStringUtils.replace(test, “test”, “simple test”);

11.緩存昂貴的資源,比如數據庫連接

緩存是一種流行的解決方案來避免重復執行昂貴或頻繁使用的代碼片段。一般的想法很簡單:重復使用這些資源比一次又一次地創建一個新的資源要便宜得多。

一個典型的例子就是在池中緩存數據庫連接。創建新連接需要時間,如果重用現有連接,則可以避免。

還可以在Java語言本身中找到其他示例。例如,Integer類的valueOf方法緩存了- 128和127之間的值。你可能會說,創建一個新整數并不太貴,但它經常使用,緩存最常用的值提供了性能方面的好處。

但當你考慮緩存時,請記住,緩存實現也會產生開銷。你需要花費額外的內存來存儲可重用資源,因此可能需要管理你的緩存,以使資源能夠訪問或刪除過時的資源。

因此,在你開始緩存任何資源之前,請確保是經常使用。

總結

正如你所看到的,提高應用程序的性能有時不需要做大量的工作。這篇文章中的大多數建議,其實只需要稍微的努力就可以將它們應用到代碼中。

但通常最重要的建議是很編程語言無關的:

  1. 在你知道有必要之前,不要優化
  2. 使用分析器來找到真正的瓶頸
  3. 首先解決最大的瓶頸問題

原文鏈接:11 Simple Java Performance Tuning Tips(責編/魏偉)

 

注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91日本视频在线| 中文国产亚洲喷潮| 91精品综合视频| 久久夜精品va视频免费观看| 一个人www欧美| 精品久久久一区二区| 国产91免费观看| 久久综合免费视频影院| 亚洲大尺度美女在线| 国产美女直播视频一区| 另类视频在线观看| 精品二区三区线观看| 久久久久日韩精品久久久男男| 久久婷婷国产麻豆91天堂| 成人高清视频观看www| 成人黄色大片在线免费观看| 国产亚洲一区二区在线| 欧美激情国产精品| 久久精品国产亚洲一区二区| 日韩精品免费在线视频| 国产美女扒开尿口久久久| 国产精品久久激情| 亚洲美女精品成人在线视频| 欧美另类在线播放| 久久精品国产亚洲| 国产精品一区二区3区| 2019av中文字幕| 欧美巨猛xxxx猛交黑人97人| 久久久www成人免费精品张筱雨| 色噜噜亚洲精品中文字幕| 日韩欧美在线网址| 中文字幕欧美日韩va免费视频| 欧美成人在线网站| 亚洲欧美激情另类校园| 亚洲视频777| 亚洲丝袜在线视频| 久久精品91久久久久久再现| 国产欧美一区二区三区视频| 欧美激情啊啊啊| 欧美亚洲成人xxx| 日韩美女视频在线观看| 奇米影视亚洲狠狠色| 中文字幕在线视频日韩| 92版电视剧仙鹤神针在线观看| 成人国产在线激情| 亚洲欧美日韩中文在线制服| 91色在线观看| 欧美成人精品影院| 欧美极品在线播放| 欧美日韩国产专区| 97国产真实伦对白精彩视频8| 日韩av观看网址| 亚洲福利视频在线| 亚洲综合中文字幕在线| 热久久这里只有精品| 国产一区二区在线免费视频| 成人疯狂猛交xxx| 欧美性猛交xxxx久久久| 欧美人交a欧美精品| 不卡av在线播放| 亚洲一区二区少妇| 久久久久久97| 亚洲精品国产品国语在线| 国产精品久久久久999| 欧美一二三视频| 亚洲日韩欧美视频一区| 欧美精品videofree1080p| 国产精品高精视频免费| 欧美日韩精品在线| 丝袜亚洲欧美日韩综合| 欧美另类老肥妇| 狠狠躁18三区二区一区| 奇米成人av国产一区二区三区| 日本成人激情视频| 一区二区三区美女xx视频| 欧美日韩在线免费观看| 日本一区二区三区四区视频| 精品无人国产偷自产在线| 最近2019年日本中文免费字幕| 日韩成人av在线播放| 777午夜精品福利在线观看| 九九热精品视频在线播放| 中文字幕免费精品一区高清| 欧美日韩一区二区三区在线免费观看| 国产精品久久久久久久7电影| 欧美乱大交做爰xxxⅹ性3| 亚洲网站在线观看| 色偷偷888欧美精品久久久| 国产精品v片在线观看不卡| 国产丝袜一区二区三区| 国产精品久久久久久久久免费| 精品国产一区av| 国产精品中文字幕在线| 日本免费在线精品| 国产综合香蕉五月婷在线| 国产欧美日韩专区发布| 久久影视免费观看| 亚洲图片在线综合| 欧美做爰性生交视频| 日韩免费在线免费观看| 色悠悠久久久久| 亚洲精品一区中文字幕乱码| 欧美国产日韩中文字幕在线| 日本精品一区二区三区在线播放视频| 日韩在线中文字| 欧美日本啪啪无遮挡网站| 久久亚洲私人国产精品va| 国产剧情久久久久久| 九色精品美女在线| 久久久久久久爱| 日韩在线免费av| 欧美激情videos| 亚洲一区二区三区在线视频| 国产精品视频色| 夜夜嗨av色综合久久久综合网| 欧美激情在线观看| 亚洲电影免费观看高清完整版在线| 夜夜嗨av色综合久久久综合网| 亚洲性夜色噜噜噜7777| 91精品国产91久久久久福利| 亚洲在线免费观看| www.国产一区| 日韩美女在线观看一区| 国产精品福利观看| 久久精品99无色码中文字幕| 成人在线激情视频| 国产精品视频免费在线观看| 久久久国产精品x99av| 国产免费一区二区三区在线能观看| 亚洲国产精品va在线看黑人| 国产精品欧美日韩一区二区| 色噜噜狠狠狠综合曰曰曰| 久久夜色精品国产亚洲aⅴ| 国产精品中文久久久久久久| 尤物tv国产一区| 欧美日韩国产在线| 欧美二区在线播放| 欧美激情综合色| 91免费欧美精品| 精品国产31久久久久久| 人人爽久久涩噜噜噜网站| 久久精品国产清自在天天线| 日韩欧美中文在线| 日韩av在线电影网| 国产精品永久免费视频| 久久久久久这里只有精品| 久久在线免费观看视频| 亚洲欧美日韩精品久久| 亚洲日本欧美中文幕| 欧美精品精品精品精品免费| 国产精品久久久久9999| 久久视频在线观看免费| 亚洲精品免费一区二区三区| 亚洲人成毛片在线播放| 久久69精品久久久久久久电影好| 成人激情免费在线| 亚洲最新av在线| 一本一道久久a久久精品逆3p| 国产自摸综合网| 欧洲中文字幕国产精品| 国产精品久久久av久久久| 久久久久久久久久久成人| 最近2019免费中文字幕视频三| 亚洲欧美日韩久久久久久|