国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java程序性能優(yōu)化技巧

這篇具有很好參考價值的文章主要介紹了Java程序性能優(yōu)化技巧。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1、慎用異常

在Java軟件開發(fā)中,經(jīng)常使用 try-catch 進行錯誤捕獲,但是,try-catch 語句對系統(tǒng)性能而言是非常糟糕的。雖然在一次 try-catch中,無法察覺到它對性能帶來的損失,但是,一旦try-catch被應(yīng)用于循環(huán)之中,就會給系統(tǒng)性能帶來極大的傷害。

以下是一段將try-catch應(yīng)用于for循環(huán)內(nèi)的示例

   public void test() {        
       int a = 0;        
       for (int i = 0; i < 1000000; i++) {            
            try {
                a = a + 1;
                System.out.println(i);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

復(fù)制

這段代碼我運行時間是 27211 ms。如果將try-catch移到循環(huán)體外,那么就能提升系統(tǒng)性能,如下代碼

    public void test() {        
    int a = 0;        
        try {            
            for (int i = 0; i < 1000000; i++) {
                a = a + 1;
                System.out.println(i);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

復(fù)制

運行耗時 15647 ms??梢妕yr-catch對系統(tǒng)性能的影響。

2、使用局部環(huán)境

調(diào)用方法時傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時變量都保存在棧(Stack)中,速度較快。其他變量,如靜態(tài)變量、實例變量等,都在堆(Heap)中創(chuàng)建,速度較慢。

下面是一段測試用例

//   private static int a = 0;
    public static void main(String[] args) {        
       int a = 0;        
       long start = System.currentTimeMillis();        
       for (int i = 0; i < 1000000; i++) {
            a = a + 1;
            System.out.println(i);
        }
        System.out.println(System.currentTimeMillis() - start);
    }

復(fù)制

運行結(jié)果很明顯,使用靜態(tài)變量耗時15677ms,使用局部變量耗時13509ms。由此可見,局部變量的訪問速度高于類的成員變量。

3、位運算代替乘除法

在所有的運算中,位運算是最為高效的。因此,可以嘗試使用位運算代替部分算術(shù)運算,來提高系統(tǒng)的運行速度。

比如在HashMap的源碼中使用了位運算

    static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

    static final int MAXIMUM_CAPACITY = 1 << 30;

復(fù)制

對于整數(shù)的乘除運算優(yōu)化

a*=2
a/=2

復(fù)制

用位運算可以寫為

a<<=1a>>=1

復(fù)制

4、替換switch

關(guān)鍵字 switch 語句用于多條件判斷, switch 語句的功能類似于 if-else 語句,兩者性能也差不多。因此,不能說 switch 語句會降低系統(tǒng)的性能。但是,在絕大部分情況下,switch 語句還是有性能提升空間的。

來看下面的例子:

    public static void main(String[] args) {        
        long start = System.currentTimeMillis();        
        int re = 0;        
        for (int i = 0;i<1000000;i++){
            re = switchInt(i);
            System.out.println(re);
        }
        System.out.println(System.currentTimeMillis() - start+"毫秒");//17860
    }    
    public static int switchInt(int z){        
           int i = z%10+1;        
           switch (i){            
           case 1:return 3;            
           case 2:return 6;            
           case 3:return 7;            
           case 4:return 8;            
           case 5:return 10;            
           case 6:return 16;            
           case 7:return 18;            
           case 8:return 44;            
           default:return -1;
     }
  }

復(fù)制

就分支邏輯而言,這種 switch 模式的性能并不差。但是如果換一種新的思路替代switch,實現(xiàn)相同的程序功能,性能就能有很大的提升空間。

    public static void main(String[] args) {        
        long start = System.currentTimeMillis();        
        int re = 0;        
        int[] sw = new int[]{0,3,6,7,8,10,16,18,44};        
        for (int i = 0;i<1000000;i++){
            re = arrayInt(sw,i);
            System.out.println(re);
        }
        System.out.println(System.currentTimeMillis() - start+"毫秒");//12590
    }    
    public static int arrayInt(
        int[] sw,int z){        
        int i = z%10+1;        
        if (i>7 || i<1){            
           return -1;
        }else {            
           return sw[i];
        }
    }

復(fù)制

以上代碼使用全新的思路,使用一個連續(xù)的數(shù)組代替了 switch 語句。因為對數(shù)據(jù)的隨機訪問是非常快的,至少好于 switch 的分支判斷。通過實驗,使用switch的語句耗時17860ms,使用數(shù)組的實現(xiàn)只耗時12590ms,提升了5s多。在軟件開發(fā)中,換一種思路可能會取得更好的效果,比如使用數(shù)組替代switch語句就是就是一個很好的例子。

5、一維數(shù)組代替二維數(shù)組

由于數(shù)組的隨機訪問的性能非常好,許多JDK類庫,如ArrayList、Vector等都是使用了數(shù)組作為其數(shù)組實現(xiàn)。但是,作為軟件開發(fā)人員也必須知道,一位數(shù)組和二維數(shù)組的訪問速度是不一樣的。一位數(shù)組的訪問速度要優(yōu)于二維數(shù)組。因此,在性能敏感的系統(tǒng)中要使用二維數(shù)組的,可以嘗試通過可靠地算法,將二維數(shù)組轉(zhuǎn)為一維數(shù)組再進行處理,以提高系統(tǒng)的響應(yīng)速度。

6、提取表達式

在軟件開發(fā)過程中,程序員很容易有意無意讓代碼做一些“重復(fù)勞動”,在大部分情況下,由于計算機的告訴運行,這些“重復(fù)勞動”并不會對性能構(gòu)成太大的威脅,但若將系統(tǒng)性能發(fā)揮到極致,提取這些“重復(fù)勞動”相當(dāng)有意義。

來看下面的測試用例:

   @Test    
   public void test(){        
        long start = System.currentTimeMillis();
        ArrayList list = new ArrayList();        
        for (int i = 0;i<100000;i++){
            System.out.println(list.add(i));
        }        //以上是為了做準(zhǔn)備
        for (int i = 0;i<list.size();i++){
            System.out.println(list.get(i));
        }
        System.out.println(System.currentTimeMillis() - start);//5444
    }

復(fù)制

如果我們把list.size()方法提取出來,優(yōu)化后的代碼如下:

    @Test    
    public void test(){        
        long start = System.currentTimeMillis();
        ArrayList list = new ArrayList();        
        for (int i = 0;i<100000;i++){
            System.out.println(list.add(i));
        }        //以上是為了做準(zhǔn)備
        int n = list.size();        
        for (int i = 0;i<n;i++){
            System.out.println(list.get(i));
        }
        System.out.println(System.currentTimeMillis() - start);//3514
    }

復(fù)制

在我的機器上,前者耗時5444ms,后者耗時3514ms,相差2s左右,可見,提取重復(fù)的操作是相當(dāng)有意義的。

7、展開循環(huán)

與前面所介紹的優(yōu)化技巧略有不同,筆者認(rèn)為展開循環(huán)是一種在極端情況下使用的優(yōu)化手段,因為展開循環(huán)很可能會影響代碼的可讀性和可維護性,而這兩者對軟件系統(tǒng)來說也是極為重要的。但是,當(dāng)性能問題成為系統(tǒng)主要矛盾時,展開循環(huán)絕對是一種值得嘗試的技術(shù)。

8、布爾運算代替位運算

雖然位運算的速度遠(yuǎn)遠(yuǎn)高于算術(shù)運算,但是在條件判斷時,使用位運算替代布爾運算卻是非常錯誤的選擇。

在條件判斷時,Java會對布爾運算做相當(dāng)充分的優(yōu)化。假設(shè)有表達式 a,b,c 進行布爾運算“a&&b&&c” ,根據(jù)邏輯與的特點,只要在整個布爾表達式中有一項返回false,整個表達式就返回false,因此,當(dāng)表達式a為false時,該表達式將立即返回 false ,而不會再去計算表達式b 和c。同理,當(dāng)計算表達式為“a||b||c”時,也是一樣。

若使用位運算(按位與”&“、按位或”|“)代替邏輯與和邏輯或,雖然位運算本身沒有性能問題,但是位運算總是要將所有的子表達式全部計算完成后,再給出最終結(jié)果。因此,從這個角度來說,使用位運算替代布爾運算會使系統(tǒng)進行很多無效計算。

9、使用arrayCopy()

數(shù)組復(fù)制是一項使用頻率很高的功能,JDK中提供了一個高效的API來實現(xiàn)它:

如果在應(yīng)用程序需要進行數(shù)組復(fù)制,應(yīng)該使用這個函數(shù),而不是自己實現(xiàn)。

方法代碼:

  public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,                                        int length);

復(fù)制

它的用法是將源數(shù)組 src 從索引 srcPos 處復(fù)制到目標(biāo)數(shù)組 dest 的 索引destPos處,復(fù)制的長度為 length。

System.arraycopy() 方法是 native 方法,通常 native 方法的性能要優(yōu)于普通的方法。僅出于性能考慮,在軟件開發(fā)中,盡可能調(diào)用 native 方法。

10、使用Buffer進行I/O流操作

除NIO外,使用 Java 進行 I/O操作有兩種基本方法:

  1. 使用基于InputStream 和 OutputStream 的方式;(字節(jié)流)
  2. 使用 Writer 和 Reader。(字符流)

無論使用哪種方式進行文件 I/O,如果能合理地使用緩沖,就能有效的提高I/O的性能。

Java程序性能優(yōu)化技巧

11、使用clone()代替new

在Java中新建對象實例最常用的方法是使用 new 關(guān)鍵字。JDK對 new 的支持非常好,使用 new 關(guān)鍵字創(chuàng)建輕量級對象時,速度非??臁5?,對于重量級對象,由于對象在構(gòu)造函數(shù)中可能會進行一些復(fù)雜且耗時的操作,因此,構(gòu)造函數(shù)的執(zhí)行時間可能會比較長。導(dǎo)致系統(tǒng)短期內(nèi)無法獲得大量的實例。為了解決這個問題,可以使用Object.clone() 方法。

Object.clone() 方法可以繞過構(gòu)造函數(shù),快速復(fù)制一個對象實例。但是,在默認(rèn)情況下,clone()方法生成的實例只是原對象的淺拷貝。

這里不得不提Java只有值傳遞了,關(guān)于這點,我的理解是基本數(shù)據(jù)類型引用的是值,普通對象引用的也是值,不過這個普通對象引用的值其實是一個對象的地址。代碼示例:

  int i = 0;  int j = i;    //i的值是0
  User user1 = new User();
  User user2 = user1;   //user1值是new User()的內(nèi)存地址

復(fù)制

如果需要深拷貝,則需要重新實現(xiàn) clone() 方法。下面看一下ArrayList實現(xiàn)的clone()方法:

    public Object clone() {        
       try {
            ArrayList<?> v = (ArrayList<?>) super.clone();
            v.elementData = Arrays.copyOf(elementData, size);
            v.modCount = 0;            
            return v;
        } catch (CloneNotSupportedException e) {            
            // this shouldn't happen, since we are Cloneable
            throw new InternalError(e);
        }
    }

復(fù)制

在ArrayList的clone()方法中,首先使用 super.clone() 方法生成一份淺拷貝對象。然后拷貝一份新的elementData數(shù)組讓新的ArrayList去引用。使克隆后的ArrayList對象與原對象持有不同的引用,實現(xiàn)了深拷貝。

12、靜態(tài)方法替代實例方法

使用 static 關(guān)鍵字描述的方法為靜態(tài)方法。在Java中,由于實例方法需要維護一張類似虛函數(shù)表的結(jié)構(gòu),以實現(xiàn)對多態(tài)的支持。與靜態(tài)方法相比,實例方法的調(diào)用需要更多的資源。因此,對于一些常用的工具類方法,沒有對其進行重載的必要,那么將它們聲明為 static,便可以加速方法的調(diào)用。同時,調(diào)用 static 方法不需要生成類的實例。比調(diào)用實例方法更為方便、易用。文章來源地址http://www.zghlxwxcb.cn/news/detail-513653.html

到了這里,關(guān)于Java程序性能優(yōu)化技巧的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 軟件測試/測試開發(fā)/全日制|MySQL主鍵約束詳解:保障數(shù)據(jù)完整性與性能優(yōu)化

    軟件測試/測試開發(fā)/全日制|MySQL主鍵約束詳解:保障數(shù)據(jù)完整性與性能優(yōu)化

    簡介 主鍵(PRIMARY KEY)的完整稱呼是“主鍵約束”,是 MySQL 中使用最為頻繁的約束。一般情況下,為了便于 DBMS 更快的查找到表中的記錄,都會在表中設(shè)置一個主鍵。 MySQL是一種廣泛使用的開源關(guān)系型數(shù)據(jù)庫管理系統(tǒng),其支持多種數(shù)據(jù)約束,其中主鍵約束是其中最重要的之一

    2024年02月19日
    瀏覽(61)
  • 優(yōu)化 RDMA 代碼的建議和技巧-rdma性能優(yōu)化技巧-避坑指南

    優(yōu)化 RDMA 代碼的建議和技巧-rdma性能優(yōu)化技巧-避坑指南

    DMA 代表直接內(nèi)存訪問。這意味著應(yīng)用程序可以在 CPU 干預(yù)的情況下直接訪問(讀/寫)主機內(nèi)存。如果您在主機之間執(zhí)行此操作,它將成為遠(yuǎn)程直接內(nèi)存訪問 (RDMA) 在閱讀有關(guān) RDMA 的內(nèi)容時,您會注意到一些用于描述其優(yōu)點的術(shù)語。 “零復(fù)制 Zero Copy”、“內(nèi)核繞過 Kernel Bypas

    2024年02月03日
    瀏覽(30)
  • [SpringCloud] 組件性能優(yōu)化技巧

    Feign 配置優(yōu)化 hystrix配置 優(yōu)化 ribbon 優(yōu)化 Servlet 容器 優(yōu)化 Zuul配置 優(yōu)化 1.Servlet 容器 優(yōu)化 默認(rèn)情況下, Spring Boot 使用 Tomcat 來作為內(nèi)嵌的 Servlet 容器, 可以將 Web 服務(wù)器切換到 Undertow 來提高應(yīng)用性能, Undertow 是紅帽公司開發(fā)的一款基于 NIO 的高性能 Web 嵌入式。 Zuul使用的內(nèi)置容

    2024年02月12日
    瀏覽(22)
  • JVM逃逸分析原理解析:優(yōu)化Java程序性能和內(nèi)存利用效率

    在Java開發(fā)中,性能和內(nèi)存利用效率一直是開發(fā)者關(guān)注的焦點。為了提高Java程序的執(zhí)行效率,JVM引入了逃逸分析技術(shù)。本文將詳細(xì)解析JVM逃逸分析的原理,幫助讀者深入理解其工作機制。 逃逸分析是一種用于確定對象在方法的生命周期內(nèi)是否逃逸出方法外部范圍的技術(shù)。在

    2024年01月20日
    瀏覽(87)
  • .NET Core性能優(yōu)化技巧

    .NET Core作為一個跨平臺的開源框架,以其高效、靈活和可擴展的特性受到了廣大開發(fā)者的青睞。但在實際開發(fā)中,如何確保應(yīng)用程序的性能始終是一個關(guān)鍵的問題。本文將介紹十大.NET Core性能優(yōu)化技巧,幫助開發(fā)者提升應(yīng)用程序的性能。 1. 使用異步編程 .NET Core支持異步編程

    2024年02月19日
    瀏覽(17)
  • MongoDB 數(shù)據(jù)庫性能優(yōu)化技巧

    原文:MongoDB 數(shù)據(jù)庫性能優(yōu)化技巧 (techdatafuture.com) MongoDB 是一款靈活且可擴展的NoSQL數(shù)據(jù)庫,為了提高其性能,我們可以采取一些優(yōu)化技巧。本文將介紹一些MongoDB性能優(yōu)化的關(guān)鍵點,包括索引的使用、查詢優(yōu)化、數(shù)據(jù)模型設(shè)計和硬件優(yōu)化等。 ?? ? ?? ?1.合理使用索引 ?? ?索

    2024年02月09日
    瀏覽(46)
  • 關(guān)于 Vue 項目性能優(yōu)化技巧分享

    關(guān)于 Vue 項目性能優(yōu)化技巧分享

    前言 Vue 框架通過數(shù)據(jù)雙向綁定和虛擬 DOM 技術(shù),幫我們處理了前端開發(fā)中最臟最累的 DOM 操作部分, 我們不再需要去考慮如何操作 DOM 以及如何最高效地操作 DOM;但 Vue 項目中仍然存在項目首屏優(yōu)化、Webpack 編譯配置優(yōu)化等問題,所以我們?nèi)匀恍枰リP(guān)注 Vue 項目性能方面的優(yōu)

    2024年02月04日
    瀏覽(20)
  • 一份Node.js性能優(yōu)化技巧指南

    一份Node.js性能優(yōu)化技巧指南

    你是一個踏入后端開發(fā)領(lǐng)域的前端愛好者嗎??? 準(zhǔn)備好迎接在Node.js錯綜復(fù)雜的景觀中驚險刺激的旅程吧!?? 在這個探險中,我們將探索后端的無數(shù)奇跡,從使用Node.js框架快速創(chuàng)建自己的后端,到應(yīng)對性能分析、測試,深入內(nèi)存管理。???? 加入我們,揭開C++插件的奧秘,征服子進程

    2024年02月21日
    瀏覽(17)
  • 一文速學(xué)-selenium高階性能優(yōu)化技巧

    一文速學(xué)-selenium高階性能優(yōu)化技巧

    最近寫的挺多自動化辦公的selenium程序沒有做優(yōu)化,執(zhí)行效率不高,啟動瀏覽器又慢但是又可能出現(xiàn)其他不可控的因素,總結(jié)來說雖然放心運行但是又沒那么好用,項目是寫完了最后還是需要優(yōu)化結(jié)尾的。selenium程序優(yōu)化空間還是非常大的,根據(jù)自己項目的需求來進一步精簡,

    2024年01月16日
    瀏覽(32)
  • 提升性能:QML Canvas 繪圖優(yōu)化技巧

    減少繪制操作 : 當(dāng)我們有一個動態(tài)更新的圖形,例如實時更新的數(shù)據(jù)可視化圖表,可以通過設(shè)置一個定時器來控制更新頻率,而不是每次數(shù)據(jù)更新都重新繪制整個圖形。 使用硬件加速 : 通過將Canvas的 renderTarget 屬性設(shè)置為 Canvas.FramebufferObject 來啟用硬件加速: renderTarget: 枚

    2024年04月17日
    瀏覽(99)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包