前言
本文簡單測試了 StringBuilder 和 String 在做連接時的性能差異。
測試原理
循環1萬次,連接相同字符串 “1234567890”,然後記錄 StringBuilder 和 String 的操作時間。
測試結果
結果測試了5次,如下所示:
s1.length = 976.56 KB, s2.length = 976.57 KB.
StringBuilder = 5.94 ms, String = 7113.41 ms.
s1.length = 976.56 KB, s2.length = 976.57 KB.
StringBuilder = 1.58 ms, String = 7347.46 ms.
s1.length = 976.56 KB, s2.length = 976.57 KB.
StringBuilder = 1.12 ms, String = 7178.77 ms.
s1.length = 976.56 KB, s2.length = 976.57 KB.
StringBuilder = 1.11 ms, String = 6902.27 ms.
s1.length = 976.56 KB, s2.length = 976.57 KB.
StringBuilder = 1.04 ms, String = 6461.00 ms.
結論
可以看到當連接過於頻繁時,String的時間消耗居然達到了StringBuilder的幾千倍,效率非常低下。所以在頻繁使用字符串拼接操作時,一定要使用StringBuilder類來代替String以提高性能。
PS. Java在數據量大時的性能比C#要好在此問題中也有表示,此文使用C#實現性能顯然不如Java。
源代碼
public class StringTest {
public static void main(String[] args) {
String s1 = null, s2 = null;
long t1 = System.nanoTime();
StringBuilder sb = new StringBuilder();
for(int i = 0; i < 100000; i++)
sb.append("1234567890");
s1 = sb.toString();
long t2 = System.nanoTime();
for(int i = 0; i < 100000; i++)
s2 += "1234567890";
long t3 = System.nanoTime();
System.out.printf("s1.length = %.2f KB, s2.length = %.2f KB.\n", s1.length()/1024.0, s2.length()/1024.0);
System.out.printf("StringBuilder = %.2f ms, String = %.2f ms.\n", (t2 - t1)/1000000.0, (t3 - t2)/1000000.0);
}
}