java中字符串鏈接性能比較

原帖地址:http://blog.csdn.net/bestseal/archive/2008/04/16/2296283.aspx

 

public static String concat1(String s1, String s2, String s3, String s4, String s5, String s6) {
        String result = "";
        result += s1;
        result += s2;
        result += s3;
        result += s4;
        result += s5;
        result += s6;
        return result;
    }

    public static String concat2(String s1, String s2, String s3, String s4, String s5, String s6) {
        StringBuffer result = new StringBuffer();
        result.append(s1);
        result.append(s2);
        result.append(s3);
        result.append(s4);
        result.append(s5);
        result.append(s6);
        return result.toString();
    }

    public static String concat3(String s1, String s2, String s3, String s4, String s5, String s6) {
        return new StringBuffer(s1.length() + s2.length() + s3.length() + s4.length() + s5.length() + s6.length())
                .append(s1).append(s2).append(s3).append(s4).append(s5).append(s6).toString();
    }

    public static String concat4(String s1, String s2, String s3, String s4, String s5, String s6) {
        return s1 + s2 + s3 + s4 + s5 + s6;
    }

    public static String concat5(String s1, String s2, String s3, String s4, String s5, String s6) {
        return new StringBuilder(s1.length() + s2.length() + s3.length() + s4.length() + s5.length() + s6.length())
                .append(s1).append(s2).append(s3).append(s4).append(s5).append(s6).toString();
    }

第一種寫法是最土的寫法,也最累贅,事實上看到這樣的代碼我都會有點頭疼。看過《Effective Java》的朋友都知道用StringBuffer吧,用第二種寫法的人應該也不少。第4種寫法當然最簡捷,最優美的了,就是不知道性能怎麼樣。Java 5里加了個StringBuilder類,與StringBuffer功能一樣,就是沒有同步,所有用StringBuilder代替 StringBuffer肯定對性能有好處,這樣就產生的第5種寫法。

還是做個測試有說服力。我的機器上同時裝了JDK 5和JDK 6,兩個都測了一下。執行每個函數10000000次(輸入的每個參數都是"a"),各種寫法用時如下,單位毫秒:

----------------------------------
我補充JDK 3:
[concat1] Time: <19656>
[concat2] Time: <4032>
[concat3] Time: <5671>
[concat4] Time: <4469>

我補充JDK 4:
[concat1] Time: <36265>
[concat2] Time: <12156>
[concat3] Time: <13860>
[concat4] Time: <12859>
-----------------------------------

JDK 5:
concat1: 13776
concat2: 5081
concat3: 4944
concat4: 4202
concat5: 4047

JDK 6:
concat1: 11801
concat2: 3930
concat3: 3976
concat4: 3353
concat5: 3440

可以看出第1種寫法果然最慢,第二種寫法由於用了StringBuffer,快了很多。奇怪的是第4種寫法竟然也很快,比用 StringBuffer還快,怎麼回事?其實如果你調試過字符串連接的執行過程就會知道當用第4種寫法時Java會自動使用 StringBuilder.append()函數來進行連接。所以最簡捷的第4種寫法已經夠快了。在JDK 5裏,第5種寫法最快,因爲在創建StringBuilder的時候預先計算了總長度,消除了內存重分配。不過沒有必要這麼寫,JDK 6裏已經爲第4種寫法做了更好的優化,第5種寫法反而慢了。

由此可見,採用最簡單的第4種寫法對於Java的實現來說優化的可能性越大。就像SQL一樣,由於採用了陳述式的寫法,優化器纔有了優化的餘地。想起了兩句話:
1. 簡單即美,誰都希望看到簡潔明快的代碼,不希望看到冗長乏味的代碼
2. 性能優化是萬惡之源

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章