激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

香港云服务器
服務(wù)器之家 - 編程語言 - JAVA教程 - java字符串拼接與性能分析詳解

java字符串拼接與性能分析詳解

2019-10-27 12:13java技術(shù)網(wǎng) JAVA教程

在JAVA中拼接兩個字符串的最簡便的方式就是使用操作符”+”。如果你用”+”來連接固定長度的字符串,可能性能上會稍受影響,但是如果你是在循環(huán)中來”+”多個串的話,性能將指數(shù)倍的下降,下面我們分析一下JAVA字符串拼接的

假設(shè)有一個字符串,我們將對這個字符串做大量循環(huán)拼接操作,使用”+”的話將得到最低的性能。但是究竟這個性能有多差?如果我們同時也把StringBuffer,StringBuilder或String.concat()放入性能測試中,結(jié)果又會如何呢?本文將會就這些問題給出一個答案!

我們將使用Per4j來計算性能,因?yàn)檫@個工具可以給我們一個完整的性能指標(biāo)集合,比如最小,最大耗時,統(tǒng)計時間段的標(biāo)準(zhǔn)偏差等。在測試代碼中,為了得到一個準(zhǔn)確的標(biāo)準(zhǔn)偏差值,我們將執(zhí)行20個拼接”*”50,000次的測試。下面是我們將使用到的拼接字符串的方法:

復(fù)制代碼代碼如下:

Concatenation Operator (+)
String concat method – concat(String str)
StringBuffer append method – append(String str)
StringBuilder append method – append(String str)

 

最后,我們將看看字節(jié)碼,來研究這些方法到底是如何執(zhí)行的。現(xiàn)在,讓我們先開始來創(chuàng)建我捫的類。注意為了計算每個循環(huán)的性能,代碼中的每段測試代碼都需要用Per4J庫進(jìn)行封裝。首先我們先定義迭代次數(shù)

 

復(fù)制代碼代碼如下:

private static  final int  OUTER_ITERATION=20;  
private static final int INNER_ITERATION=50000;  

 

接下來,我們將使用上述4個方法來實(shí)現(xiàn)我們的測試代碼。

 

復(fù)制代碼代碼如下:

String addTestStr = "";  

String concatTestStr = "";  

StringBuffer concatTestSb = null;  

StringBuilder concatTestSbu = null;  

for (int outerIndex=0;outerIndex<=OUTER_ITERATION;outerIndex++) {  

    StopWatch stopWatch = new LoggingStopWatch("StringAddConcat");  

    addTestStr = "";  

    for (int innerIndex=0;innerIndex<=INNER_ITERATION;innerIndex++)  

    addTestStr += "*";  

    stopWatch.stop();  

}        

for (int outerIndex=0;outerIndex<=OUTER_ITERATION;outerIndex++) {  

    StopWatch stopWatch = new LoggingStopWatch("StringConcat");  

    concatTestStr = "";  

    for (int innerIndex=0;innerIndex<=INNER_ITERATION;innerIndex++)  

    concatTestStr.concat("*");  

    stopWatch.stop();  

}  

for (int outerIndex=0;outerIndex<=OUTER_ITERATION;outerIndex++) {  

    StopWatch stopWatch = new LoggingStopWatch("StringBufferConcat");  

    concatTestSb = new StringBuffer();  

    for (int innerIndex=0;innerIndex<=INNER_ITERATION;innerIndex++)  

    concatTestSb.append("*");  

    stopWatch.stop();  

}  

for (int outerIndex=0;outerIndex<=OUTER_ITERATION;outerIndex++) {  

    StopWatch stopWatch = new LoggingStopWatch("StringBuilderConcat");  

    concatTestSbu = new StringBuilder();  

    for (int innerIndex=0;innerIndex<=INNER_ITERATION;innerIndex++)  

    concatTestSbu.append("*");  

    stopWatch.stop();  

}  

 


接下來通過運(yùn)行程序來生成性能指標(biāo)。我的運(yùn)行環(huán)境是64位的Windown7操作系統(tǒng),32位的JVM(7-ea) 帶4GB內(nèi)存,雙核Quad 2.00GHz的CPU的機(jī)器

結(jié)果非常完美如我們想象的那樣。唯一比較有趣的事情是為什么String.concat也很不錯,我們都知道,String是一個常類(初始化后就不會改變的類),那么為什么concat的性能會更好一些呢。(譯者注: 其實(shí)原文作者的測試代碼有問題,對于concat()方法的測試代碼應(yīng)該寫成 concatTestStr=concatTestStr.concat(“*”)才對。)為了回答這個問題,我們應(yīng)該看看concat反編譯出來的字節(jié) 碼。在本文的下載包里面包含了所有的字節(jié)碼,但是現(xiàn)在我們先看一下concat的這個代碼片段:

 

復(fù)制代碼代碼如下:

46:  new #6; //class java/lang/StringBuilder 
49:  dup 
50:  invokespecial   #7; //Method java/lang/StringBuilder."<init>":()V 
53:  aload_1 
54:  invokevirtual   #8; //Method java/lang/StringBuilder.append: 
         (Ljava/lang/String;)Ljava/lang/StringBuilder; 
57:  ldc #9; //String * 
59:  invokevirtual   #8; //Method java/lang/StringBuilder.append: 
         (Ljava/lang/String;)Ljava/lang/StringBuilder; 
62:  invokevirtual   #10; //Method java/lang/StringBuilder.toString:() 
         Ljava/lang/String; 
65:  astore_1 
66:  iinc    7, 1 
69:  goto    38 

 

這段代碼是String.concat()的字節(jié)碼,從這段代碼中,我們可以清楚的看到,concat()方法使用了 StringBuilder,concat()的性能應(yīng)該和StringBuilder的一樣好,但是由于額外的創(chuàng)建StringBuilder和 做.append(str).append(str).toString()的操作,使得concate的性能會受到一些影響,所以 StringBuilder和String Cancate的時間是1.8和3.3。

因此,即時在做最簡單的拼接時,如果我們不想創(chuàng)建StringBuffer或StringBuilder實(shí)例使,我們也因該使用concat。但是對于大量的字符串拼接操作,我們就不應(yīng)該使用concat(譯者注:因 為測試代碼功能上并不完全等價,更換后的測試代碼concat的平均處理時間是1650.9毫秒。這個結(jié)果在原文的評論里面。),因?yàn)閏oncat會降低 你程序的性能,消耗你的cpu。因此,在不考慮線程安全和同步的情況下,為了獲得最高的性能,我們應(yīng)盡量使用StringBuilder。

延伸 · 閱讀

精彩推薦
339
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 亚洲特黄a级毛片在线播放 激情视频免费看 | 色诱亚洲精品久久久久久 | 久久国产在线观看 | 粉嫩粉嫩一区二区三区在线播放 | 婷婷久久综合九色综合色多多蜜臀 | 成人黄色一级电影 | 媚药按摩痉挛w中文字幕 | 4p一女两男做爰在线观看 | 免费a视频在线观看 | 国产精品一区二区三区在线 | 一级做a爱片性色毛片 | av性色全交蜜桃成熟时 | 超级av在线 | 午夜亚洲影院 | 欧美成人a | 狠狠色噜噜狠狠狠米奇9999 | 日日摸夜夜骑 | 免费黄色小视频网站 | 黄a大片| 欧美一区二区黄 | 欧美精品一级 | 日韩中文字幕一区二区三区 | 香蕉成人在线视频 | 久久精品视频黄色 | 免费黄色大片网站 | 免费观看三级毛片 | 免费国产网站 | 亚洲成人福利在线观看 | 国产中出视频 | 一级毛片在线免费观看视频 | 国产一区二区三区视频在线 | 亚洲精品自在在线观看 | 久久亚洲美女视频 | 国产成人自拍av | 国产91精品一区二区麻豆亚洲 | 中文字幕在线观看二区 | 欧美成人精品欧美一级 | 日韩黄a| 久久国产精 | 欧美国产成人在线 | 草草视频免费 |