StringBuilder和String做字符串拼接時的性能比較

前言

本文簡單測試了 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);
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章