簡體   English   中英

Java編譯器為字符串連接構建低效的代碼?

[英]Java compiler builds inefficient code for string concatination?

我認為這是結合字符串的最有效方法

new StringBuilder(s1.length() + s2.length() + s3.length()).append(s1).append(s2).append(s3).toString();

這里創建了StringBuilder的緩沖區,其容量足以容納其中的所有字符串,否則StringBuilder可能需要將緩沖區擴展最多3次。

但是當我編譯/反編譯時

String s4 = s1 + s2 + s3;

我得到了由javac(1.7.0_03)構建的.class中的實際代碼

String s4 = (new StringBuilder(String.valueOf(s1))).append(s2).append(s3).toString();

哪種方式更有效?

UPDATE

正如Steven Schlansker所說,這是一次性能測試

                String s1 = "0123456789";
                String s2 = s1 + s1 + s1;
                String s3 = s1 + s1 + s1 + s1 + s1 + s1;
                long t0 = System.currentTimeMillis();
                for (int i = 0; i < 500000; i++) {

                String s4 = new StringBuilder(s1.length() + s2.length() + s3.length()).append(s1).append(s2).append(s3).toString();

//          String s4 = s1 + s2 + s3;

                }
                System.out.println(System.currentTimeMillis() - t0);

它並不完美,但結果似乎證明我的版本速度提高了約30%。 在我的筆記本(Celeron 925)上,它為ver.1 aganist提供~230 ms,為ver.2提供300 ms。 實際上這是我的預期。 所以我認為如果javac以更有效的方式編譯字符串連接將是一個好主意。 有足夠的線條像

return "\\Q" + s + "\\E";

甚至在JDK課程中。 最后一行來自java.util.Pattern,它是為提高效率而設計的

取決於你執行它的環境。如果沒有某種測試,不可能肯定地得出一個比另一個更好的結論。

也就是說,我同意提前知道最終尺寸可能會帶來一些好處。

我懷疑如果你寫一個微基准測試,你會發現差異在幾乎所有應用中都是微不足道的。

編輯基准建議:

我看到你在帖子中添加了一些實際數據。 恭喜! 你走在正確的軌道上:-)

不幸的是,Java有許多功能,這些功能對於編寫正確的基准測試是不利的。 您應該看一下如何在Java中編寫正確的微基准測試? 如果你想讓你的結果准確。 同樣值得考慮的是,在這種情況下看起來很大的加速比在“真實”程序的背景下看起來要小得多。 單個數據庫提取(以毫秒為單位)可以輕松地使內存分配中的任何增益完全不感興趣(以納秒為單位)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM