java性能優化,Java性能優化實踐

本文目錄一覽:

北大青鳥java培訓:Java應用的五項性能優化技巧?

要想對Java應用代碼進行優化,我們首先需要分析其具體工作原理。

事實上,影響性能優化效果的因素多種多樣,我們需要從垃圾回收、操作系統設置以及虛擬機制等多個角度着眼,方可順利完成任務。

在今天的文章中,江西IT培訓將分享五項性能優化技巧,希望能為你的Java應用提升工作帶來啟示。

1.從最小Heap分配入手2.使用各類Java性能工具3.使用StringBuilder而非+運算符4.避免使用迭代器5.建立更好的並發控制機制

北大青鳥java培訓:Java性能調優有哪些技巧?

大多數Java開發人員都認為性能優化是複雜的,需要大量的經驗和知識。

其實這樣的說法是有一定的道理的,一般情況下,優化應用程序以獲得最好的性能不是一件容易的事。

但這並不意味着如果你沒有知識,你什麼也做不了,下面河南電腦培訓為大家介紹一些易於遵循的調整方法。

1、必要之前不要優化這可能是最重要的性能調整之一。

您將要根據一般的最佳實踐來高效地實施用例。

但是,這並不意味着在需要之前,必須更換標準庫或進行複雜的優化。

在大多數情況下,過早的優化不僅佔用大量的時間,而且不易讀取代碼,還可以進行維護。

更糟糕的是,河南IT培訓發現這些優化通常不能帶來任何好處,而你花費大量時間進行優化是應用程序的一個非關鍵部分。

2、為應用程序創建性能這是另一種常用技術,可幫助您避免在生產後發生的許多意外問題。

河南IT培訓認為整個應用程序的性能測試,必須始終定義套件並在性能提高之前和之後運行。

3、處理最大的瓶頸創建測試套件並使用分析器分析應用程序後,您可以列出需要解決的問題,保證提高性能。

這樣非常好,但我還沒有回答你應該從哪裡開始的問題。

北大青鳥建議您可以專註於速效系統,或從最重要的問題開始。

Java程序性能優化-代理模式(5)

  代理模式( )

在以上代碼中 使用CtField make()方法和CtNewMehod make()方法在運行時生成了代理類的字段和方法 這些邏輯由Javassist的CtClass對象處理 將Java代碼轉換為對應的位元組碼 並生成動態代理類的實例

注意 與靜態代理相比 動態代理可以很大幅度地減少代碼行數 並提升系統的靈活性

在Java中 動態代理類的生成主要涉及對ClassLoader的使用 這裡以CGLIB為例 簡要闡述動態類的加載過程 使用CGLIB生成動態代理 首先需要生成Enhancer類實例 並指定用於處理代理業務的回調類 在Enhancer create()方法中 會使用DefaultGeneratorStrategy Generate()方法生成動態代理類的位元組碼 並保存在byte數組中 接着使用ReflectUtils defineClass()方法 通過反射 調用ClassLoader defineClass()方法 將位元組碼裝載到ClassLoader中 完成類的加載 最後使用ReflectUtils newInstance()方法 通過反射 生成動態類的實例 並返回該實例 無論使用何種方法生成動態代理 雖然實現細節不同 但主要邏輯都如圖 所示

圖   實現動態代理的基本步驟

前文介紹的幾種動態代理的生成方法 性能有一定差異 為了能更好地測試它們的性能 去掉DBQuery類中的sleep()代碼 並使用以下方法測試

public static final int CIRCLE= ;

public static void main(String[] args) throws Exception {

IDBQuery d=null;

long begin=System currentTimeMillis()

d=createJdkProxy()                      //測試JDK動態代理

System out println( createJdkProxy: +(System currentTimeMillis() beg    in))

System out println( JdkProxy class: +d getClass() getName())

begin=System currentTimeMillis()

for(int i= ;iCIRCLE;i++)

d request()

System out println( callJdkProxy: +(System currentTimeMillis() begin    ))

begin=System currentTimeMillis()

d=createCglibProxy()                    //測試CGLIB動態代理

System out println( createCglibProxy: +(System currentTimeMillis() b    egin))

System out println( CglibProxy class: +d getClass() getName())

begin=System currentTimeMillis()

for(int i= ;iCIRCLE;i++)

d request()

System out println( callCglibProxy: +(System currentTimeMillis() beg    in))

begin=System currentTimeMillis()

d=createJavassistDynProxy()             //測試Javaassist動態代理

System out println( createJavassistDynProxy: +(System currentTimeMil    lis() begin))

System out println( JavassistDynProxy class: +d getClass() getName())

begin=System currentTimeMillis()

for(int i= ;iCIRCLE;i++)

d request()

System out println( callJavassistDynProxy: +(System currentTimeMilli    s() begin))

begin=System currentTimeMillis()

d=createJavassistBytecodeDynamicProxy()     //測試Javassist動態代理

System out println( createJavassistBytecodeDynamicProxy: +(System cu    rrentTimeMillis() begin))

System out println( JavassistBytecodeDynamicProxy class: +d getClass()

getName())

begin=System currentTimeMillis()

for(int i= ;iCIRCLE;i++)

d request()

System out println( callJavassistBytecodeDynamicProxy: +(System curr    entTimeMillis() begin))

}

       返回目錄 Java程序性能優化 讓你的Java程序更快 更穩定

編輯推薦

       Java程序設計培訓視頻教程

       J EE高級框架實戰培訓視頻教程

       J ME移動開發實戰教學視頻

Visual C++音頻/視頻技術開發與實戰

Oracle索引技術

lishixinzhi/Article/program/Java/gj/201311/27830

優化JAVA性能

添加較小的輔助性函數在最初版本的Swing工具包中 創建過多的Point Rectangle和Dimension對象會嚴重地影響程序的性能 儘管一次在一個Point或Rectangle對象中返回多個值似乎更有效率 但這樣作的代價要比調用多個方法高得多 在最近的Swing版本推出之前 這個問題可以通過簡單地在組件或其他類中添加一些輔助性的方法得到改善 如下所示 public int getX() { return myBounds x; } public int getY() { return myBounds y; } public int getHeight() { return myBounds height; } public int getWidth() { return myBounds width; } 現在 調用程序可以在不創建臨時對象的情況下得到同樣的結果 如下所示 int x = ponent getX(); int y = ponent getY(); int h = ponent getHeight(); int w = ponent getWidth(); 原來的getBounds()仍然可以使用 較小的輔助性函數只不過提供了一種實現同樣目標的效率更高的方法 其結果是 Rectangle的接口將完全暴露在組件的接口中 當修改Swing使之支持並可以使用這些較小的輔助性函數後 其結果是 Swing中的許多操作的運行速度都比原來快了二倍 由於GUI代碼對性能比較敏感 這一改進的意義是重大的 這種技術帶來的負作用是對象擁有的方法更多了 而且要獲取同一種信息可以有多種方法 這就使文件變得相當大而且也更加複雜了 不利於用戶採用這一技術 但是 象Swing的例子顯示的那樣 在對性能要求比較高的情況下 這種優化技術還是十分有效的 可變性的利用除了在組件中添加象上面討論的getX()等具有簡單數據類型值的臨時函數外 Java 還使用了其他的技術來減少在AWT和Swing中的對象創建活動 在組件和其他的GUI類中添加另一種版本的getBounds() 就可以在沒有創建臨時對象的前提上使調用程序得到象Rectangle類型的返回值 public Rectangle getBounds(Rectangle returnVal) {  returnVal x = myBounds x;  returnVal y = myBounds y;  returnVal height = myBounds height;  returnVal width = myBounds width;  return returnVal; } 調用程序仍然必須創建一個Rectangle對象 不過 可以在以後的調用中重用它 如果一個調用程序反覆調用許多Component對象 就可以創建一個Rectangle對象並在每個Component中使用它 需要注意的是 這一技術只適用於可變的對象類型 不可能通過這種方式減少創建String類對象 結合二家之長一個更好的解決Point等簡單類的對象創建問題的方法是使得Point類成為不可變的 然後再定義一個可變的子類 具體方法如下面的例子所示 public class Point {  protected int x y;  public Point(int x int y) { this x = x; this y = y; }  public final int getX() { return x; }  public final int getY() { return y; } } public class MutablePoint extends Point {  public final void setX(int x) { this x = x; }  public final void setY(int y) { this y = y; } } public class Shape {  private MutablePoint myLocation;  public Shape(int x int y) { myLocation = new MutablePoint(x y); }  public Point getLocation() { return (Point) myLocation; } } 在上面的例子中 Shape可以安全地返回myLocation的地址 因為調用程序如果試圖修改這些域或調用他們的 調節器 就會返回一個出錯信息 當然 調用程序仍然可以將Point轉換為MutablePoint 但很明顯這會帶來不安全性 雖然調用程序也會得到它們所需要的返回值 )C++的開發人員會注意到 這一技術與C++中的返回一個Rectangle的常量地址(const Rectangle)有點類似━━Java不具備這樣的特性 在Java 類庫中的java math BigInteger類中 一個類無需創建新的對象就返回一個 只讀的 對象 MutableBigInteger類不是公開的 它只供java math類庫內部使用 但由於BigInteger類中的一些方法(例如gcd())是由許多的算術操作組成的 完成這些操作而無需創建臨時對象將極大地改善程序的性能 lishixinzhi/Article/program/Java/JSP/201311/19787

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/190851.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-30 09:07
下一篇 2024-11-30 09:07

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發佈。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論