java 板


LINE

本來想說 Java Code Geeks 的文章應該沒啥問題 所以翻完就算了,沒有仔細追究 BUT! M Jwo 在 blog 上留了一個 comment 坦白說我看不是很懂,全文如下 本文大錯,僅有在 compiler 可以最佳化的有限場景才是, 通常是宣告的地方,不然放到method/loop裡面就知道了, 因為只有在 method/loop 才會對效能造成大影響, 少數幾個 String 根本不再效能需要調教的地方。 其實根本不用那麼麻煩,de-compiler 看一眼就知道 都是改用 StringBuffer/StringBuilder 了。 然後我才真的去翻了原作者提供的 javap 的結果 https://github.com/skuro/stringbuilder/blob/master/java7/CatPlus.class.txt 如果你跟我一樣沒辦法直接看懂 javap 那麼對應原始碼可能比較好懂 public class CatPlus extends ACat { @Override protected String cat(String base, String append){ String result = "const1" + base; result = result + "const2"; return result + append; } } 也就是說,根本不是他說的那麼一回事情 在 Oracle JDK 7 之下,其實會用 append() 來代替 + 號 原作者 javap 的結果也是如此 要說效能慢的話,應該是因為他重複 assign 回 result 有 code 為證 我寫了一個單純的 class,在 JDK 6 下測試 public class CatPlus { public String foo (String a, String b) { return "const1" + a + "const2" + b; } } javap 之後會得到 public class CatPlus extends java.lang.Object{ public CatPlus(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return public java.lang.String foo(java.lang.String, java.lang.String); Code: 0: new #2; //class java/lang/StringBuilder 3: dup 4: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V 7: ldc #4; //String const1 9: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 12: aload_1 13: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 16: ldc #6; //String const2 18: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 21: aload_2 22: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 25: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 28: areturn } 所以,至少在 Oracle JDK 6 以後 字串用 + 號作連接跟用 StringBuilder 沒啥差別 ======== 只能說... 嗯... 愚人節快樂這樣? [核爆] -- 錢鍾書: 說出來的話 http://www.psmonkey.org 比不上不說出來的話 Java 版 cookcomic 版 只影射著說不出來的話 and more...... --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.25.15.134
1F:推 AI3767:很久以前我也做過+和sb測試,有發現速度一樣, 但,sb方便用於 04/01 23:12
2F:→ AI3767:在不同程式片段做接合. +比較適合所需字串一次性生成時 04/01 23:15
3F:推 cyclone350:我有點不懂,這在說用+號會被編譯成append,那位啥最後 04/01 23:21
4F:→ cyclone350:的結論,會是需要明確指定用 StringBuilder 來增進效能 04/01 23:24
5F:→ cha122977:是不是使用場合有差?一次性字串用+沒什麼差別, 04/01 23:26
6F:→ cyclone350:版主最後一句說沒啥差別,原文說多50% !? 04/01 23:28
7F:→ cha122977:但是摻雜判斷式而產生的字串 用StringBuilder比較好? 04/01 23:28
8F:→ cha122977:(是說推文間隔可不可以短一點 討論起來好痛苦阿囧) 04/01 23:29
本來就不應該用推文的方式來討論 這樣看的人會很痛苦 另外,Java 版從來沒有限制文章字數 or 行數 只在意是否言之有物 請見諒
9F:→ cyclone350:多50% 是愚人節的玩笑嗎 ?? 04/01 23:31
10F:→ cha122977:話說曾在版上看過一篇跑很慢的 改用StringBuilder就解了 04/01 23:32
11F:→ cha122977:找到了 是這個~ #1Fc1oO9j 04/01 23:34
其實原文也不是那麼悽慘到完全無用 或著說,他給的 CatPlus 的 test case 其實就是要模擬 #1Fc1oO9j 的狀態,也就是 while(FooCondition) { str += str; } 在這種情況下,雖然 + 的動作還是會改成用 append() 但是會重複宣告 StringBuilder 這才是真正造成效能瓶頸的地方 + 號還是會變成 append() 的,這點可以肯定 只能說原 po(包含我)不夠用功,不夠龜毛 外加沾染了國內記者的習性,喜歡標題殺人,如此而已 (謎之聲:還而已咧 [毆殺]) 是說,要不是看了這篇 我還真的不知道原本的 + 號惡魔其實已經被處理掉了 XD ※ 編輯: PsMonkey 來自: 114.25.15.134 (04/01 23:46)
12F:推 AI3767:那篇在迴圈內+=, 不是一次性加起來, 確實很高可能造成變慢 04/01 23:46
13F:→ cha122977:可以請教為何 str+=str; 會重複宣告嗎?不太明白 04/01 23:56
14F:推 coolcomm:會在每次迴圈產生新的instance 04/02 01:05







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Boy-Girl站內搜尋

TOP