java性能,java性能權威指南第二版pdf

本文目錄一覽:

優化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

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培訓:簡單的Java性能調優技巧?

大多數JAVA開發人員理所當然地以為性能優化很複雜,需要大量的經驗和知識。

好吧,不能說這是完全錯誤的。

  優化應用程序以獲得最佳性能不是一件容易的事情。

但是,這並不意味著如果你不具備這些知識,就不能做任何事情。

這裡有一些易於遵循的調優方式,遼寧java培訓建議可以做個參考!  大部分建議是針對Java的。

但也有若干建議是與語言無關的,可以應用於所有應用程序和編程語言。

在討論專門針對Java的性能調優技巧之前,讓我們先來看看通用技巧。

  1.在你知道必要之前不要優化  這可能是最重要的性能調整技巧之一。

你應該遵循常見的最佳實踐做法並嘗試高效地實現用例。

但是,這並不意味著在你證明必要之前,你應該更換任何標準庫或構建複雜的優化。

  在大多數情況下,過早優化不但會佔用大量時間,而且會使代碼變得難以閱讀和維護。

更糟糕的是,這些優化通常不會帶來任何好處,因為你花費大量時間來優化的是應用程序的非關鍵部分。

  那麼,你如何證明你需要優化一些東西呢?  首先,你需要定義應用程序代碼的速度得多快,例如,為所有API調用指定最大響應時間,或者指定在特定時間範圍內要導入的記錄數量。

在完成這些之後,你就可以測量應用程序的哪些部分太慢需要改進。

然後,接著看第二個技巧。

  2.使用分析器查找真正的瓶頸  在你遵循第一個建議並確定了應用程序的某些部分需要改進後,那麼從哪裡開始呢?  你可以用兩種方法來解決問題:  ·查看你的代碼,並從看起來可疑或者你覺得可能會產生問題的部分開始。

  ·或者使用分析器並獲取有關代碼每個部分的行為和性能的詳細信息。

  希望不需要我解釋為什麼應該始終遵循第二種方法的原因。

  很明顯,基於分析器的方法可以讓你更好地理解代碼的性能影響,並使你能夠專註於最關鍵的部分。

如果你曾使用過分析器,那麼你一定記得曾經你是多麼驚訝於一下就找到了代碼的哪些部分產生了性能問題。

老實說,我第一次的猜測不止一次地導致我走錯了方向。

  3.為整個應用程序創建性能測試套件  這是另一個通用技巧,可以幫助你避免在將性能改進部署到生產後經常會發生的許多意外問題。

你應該總是定義一個測試整個應用程序的性能測試套件,並在性能改進之前和之後運行它。

  這些額外的測試運行將幫助你識別更改的功能和性能副作用,並確保不會導致弊大於利的更新。

如果你工作於被應用程序若干不同部分使用的組件,如資料庫或緩存,那麼這一點就尤其重要。

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

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

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

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

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

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:56
下一篇 2024-12-12 12:57

相關推薦

  • Java JsonPath 效率優化指南

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

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

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

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

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

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

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

    編程 2025-04-29
  • 運維Python和GO應用實踐指南

    本文將從多個角度詳細闡述運維Python和GO的實際應用,包括監控、管理、自動化、部署、持續集成等方面。 一、監控 運維中的監控是保證系統穩定性的重要手段。Python和GO都有強…

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

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

    編程 2025-04-29
  • Python wordcloud入門指南

    如何在Python中使用wordcloud庫生成文字雲? 一、安裝和導入wordcloud庫 在使用wordcloud前,需要保證庫已經安裝並導入: !pip install wo…

    編程 2025-04-29
  • Python應用程序的全面指南

    Python是一種功能強大而簡單易學的編程語言,適用於多種應用場景。本篇文章將從多個方面介紹Python如何應用於開發應用程序。 一、Web應用程序 目前,基於Python的Web…

    編程 2025-04-29
  • Python字元轉列表指南

    Python是一個極為流行的腳本語言,在數據處理、數據分析、人工智慧等領域廣泛應用。在很多場景下需要將字元串轉換為列表,以便於操作和處理,本篇文章將從多個方面對Python字元轉列…

    編程 2025-04-29
  • Python小波分解入門指南

    本文將介紹Python小波分解的概念、基本原理和實現方法,幫助初學者掌握相關技能。 一、小波變換概述 小波分解是一種廣泛應用於數字信號處理和圖像處理的方法,可以將信號分解成多個具有…

    編程 2025-04-29

發表回復

登錄後才能評論