StringBuilder初始化的大小对性能的影响

StringBuilder 是一个可以动态增加自身数据长度的类,其默认长度(capacity属性)为16。它有一个构造函数,可以指定其容器长度。当数据量小时,指定长度意义不大,但是当数据量比较大时,指定长度会对性能产生显著影响。本文通过一个小示例验证其对性能产生的影响。

代码如下:


public class StringBuilderTest {
	public static void main(String[] args) throws Exception {
		// 前两行分别是获取运行次数和StringBuilder的初始化长度
		int times = args.length > 0 ? Integer.parseInt(args[0]) : 100;
		int length = args.length > 1 ? Integer.parseInt(args[1]) : 0;
		
		// 运行 times 次的 test(length)方法
		long t1 = System.currentTimeMillis();
		for (int i = 0; i < times; i++)
			test(length);
		long t2 = System.currentTimeMillis();
		
		// 输出单次运行时间 
		System.out.printf("Time taken: %d ms.\n", (t2 - t1) / times);
	}

	// 这个方法只是单纯地做循环向StringBuilder中添加数据。
	static int test(int length) {
		StringBuilder sb = new StringBuilder(length);
		for (int i = 0; i < 10000000; i++)
			sb.append(i + "");
		return sb.length();
	}
}

以下是编码后,分配2GB内存,在控制台测试运行100次的运行结果。

$ java -Xmx2g -Xms2g StringBuilderTest 100 0
Time taken: 273 ms.
$ java -Xmx2g -Xms2g StringBuilderTest 100 73000000
Time taken: 205 ms.

性能差距约为30%

结论,当在使用StringBuilder处理大数据的时候,如果我们可以预知或者以很小的性能损失就能获得数据的大小时,提前指定StringBuilder的长度可显著提高处理速度。

你可能感兴趣的:(性能测试,Java程序设计)