本文目錄一覽:
北大青鳥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