2015-04-15 35 views
4

更新:我通過連接+運算符進行測試,性能幾乎與使用StringBuilder進行測試(結果結果)相同。這表明,正如你們中的一些人在答案中提到的那樣,表現較慢的原因是格式分析。Java的printf()方法是否有效連接和打印字符串?

結論:Java的printf()不是連接和打印字符串的有效方法。應該使用+運營商或者最好是StringBuilder以獲得更好的性能。

在創建字符串時,Java的printf()是否使用慢串聯?即它是否在將每個元素附加到最終的String之後創建一個新的String?

我測試了使用StringBuilder來創建字符串我得到的性能提高了大約4倍的運行時間。這部分程序在我的程序中被稱爲數千次。

兩個測試之間的唯一差異是下面的代碼塊:

1)printf()(0.8秒):

System.out.printf("%d %d %d %d %d %d\n", nums[a], nums[b], 
    nums[c], nums[d], nums[e], nums[f]); 

2)StringBuilder + println()(0.2秒):

StringBuilder sb = new StringBuilder(); 
sb.append(nums[a]); 
sb.append(' '); 
sb.append(nums[b]); 
sb.append(' '); 
sb.append(nums[c]); 
sb.append(' '); 
sb.append(nums[d]); 
sb.append(' '); 
sb.append(nums[e]); 
sb.append(' '); 
sb.append(nums[f]);     
System.out.println(sb.toString()); 

3)+ operaror + println()(0.22秒):

System.out.println(nums[a] + " " + nums[b] + " " + nums[c] + " " + nums[d] + " " 
          + nums[e] + " " + nums[f]); 
+6

我的猜測是連接是無關的,但格式的分析是需要時間的。 – chrylis

+0

您可以自己連接字符串以查看是否有任何區別。如果不是@ chrylis最有可能是正確的,否則,你可能正確,但是我不會創建一個新的字符串圖像會導致大量的性能消耗。這種差異很可能發生在printf()中的格式分析中。 – CalebB

+2

好吧,如果你看看源代碼,它會做更多的事情。 ([鏈接](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/util/Formatter.java#Formatter.format%28java.util.Locale %2Cjava.lang.String%2Cjava.lang.Object%5B%5D%29)) – Bubletan

回答

1

在創建字符串時,Java的printf()是否使用慢串聯?

絕對沒有。級聯很好。

但是,由於對格式字符串的分析,速度很慢。有很多可能性和很多分支,還有其他什麼。

幾乎可以解析字符串,並使用List<FormatItem>,其中每個FormatItem將處理一個參數(也可以添加所有前面的固定文本)。一旦我做了這樣的事情,它快了2倍以上。

(*)%3$s等事情變得更加複雜。

相關問題