Blueimp 論壇首頁


列印 2024/4/17 上午 07:35:33

文章作者 jieh2007/11/30 下午 02:06:25
applause   String VS StringBuffer
盡可能不要用 String + String 請改用 StringBuilder.append(...)
 
public class StringTest {

static void bed(int t) {
String str = "";
for (int i = 0; i < t; i++) {
str += "a";
}
}

static void good(int t) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < t; i++) {
sb.append("a");
}
}

public static void main(String[] args) {
int t = 50000;
System.out.println("****** Bed Testting ******");
long startTime = System.currentTimeMillis();
long startMem = Runtime.getRuntime().freeMemory();

bed(t); // good , bed

long endMem = Runtime.getRuntime().freeMemory();
long endTime = System.currentTimeMillis();

System.out.println("Use memory: " + (startMem - endMem));
System.out.println("Use Time: " + (endTime - startTime));
}

shock 測試結果:
 
 * 2007-11-30 : OS Vista, JDK1.6, CPU intel T7300, RAM DDRII 2G
*
* 10000 次
* String : memory = 312800 bit, time = 192 ms
* StringBuffer : memory = 69152 bit, time = 2 ms
*
* 50000 次
* String : memory = 3288344 bit, time = 6812 ms
* StringBuffer : memory = 290352 bit, time = 6 ms

* *****************************************************
*
* 2003-03-03 : OS winxp, JDK1.4, CPU intel P-M 1.5G, RAM DDR 1G
*
* 10000 次
* String : memory = 153456 bit, time = 811 ms
* StringBuffer : memory = 74128 bit, time = 20 ms
*
* 50000 次
* String : memory = 1172744 bit, time = 49180 ms
* StringBuffer : memory = 295328 bit, time = 50 ms

看一下 50000 次 就非常明顯感覺到他的差異了!
很多人 SQL 都很喜歡用 + 的 把 SQL 加起來
也許你自己一支程式測試一次感覺不出來
但是現在大家都很資深了 眼光不應該如此而已
當很多程式在一個系統正式環境執行難以記數次時 耗費的資源是很大的

java 目前建議以 StringBuilder 取代 StringBuffer 分別用這兩個沒差多少
也有可能是 JDK 有順手偷偷改造 StringBuffer 也許沒有
不想退到 2003 年的環境 知道重點就好 不再多做測試
----------------------------------------
支持小惡魔
BTC : 19tn3RnCuwZVukXAwyhDWZD4uBgUZoGJPx
LTC : LTFa17pSvvoe3aU5jbmfcmEpo1xuGa9XeA
知識跟八卦一樣,越多人知道越有價值;知識最好的備份方法,散播!
藍色小惡魔(林永傑): 臉書