因为上一道有趣的数学题要循环输出空格,在网上找了一篇专门讲字符串空格的贴看看,这是最有研究行的。
性能测试报告
(单位:纳秒)
+-----------+---------------+---------------+---------------+
| | char[] | StringBuilder | StringBuffer |
+-----+-----+---------------+---------------+---------------+
| | C | 164934 | 217095 | 449021 |
| A +-----+---------------+---------------+---------------+
| | S | -- | 488630 | 670028 |
+-----+-----+---------------+---------------+---------------+
| | C | -- | 454022 | 616225 |
| B +-----+---------------+---------------+---------------+
| | S | -- | 703524 | 862583 |
+-----+-----+---------------+---------------+---------------+
A -- 对容量进行初始化
B -- 未对容量进行初始化
C -- 采用 char 空格填充
S -- 采用 String 空格填充
测试代码
循环 10000 次(用于对 JVM 进行预热)生成 10000 个字符长度的空格,求其平均数。
每种测试执行 5 次,取最小的输出时间。
public static void main(String[] args) {
long t0, t1;
String str = null ;
final int COUNT = 10000 ;
t0 = System.nanoTime();
for ( int i = 0 ; i < COUNT; i ++ ) {
str = generateSpace( 10000 );
}
t1 = System.nanoTime();
System.out.println((t1 - t0) / ( float )COUNT);
System.out.println(str.length());
}
}
char[] A-C 组代码
Java code
public static String generateSpace(int count) { if(count < 0) { throw new IllegalArgumentException("count must be greater than or equal 0."); } char[] chs = new char[count]; for(int i = 0; i < count; i++) { chs[i] = ' '; } return new String(chs); }
StringBuilder A-C 组代码
StringBuilder 与 StringBuffer 的代码一致,A 代码与 B 代码一致,
只是 A 对其容量进行了初始化,而 B 代码没有进行初始。
Java code
public static String generateSpace(int count) { if(count < 0) { throw new IllegalArgumentException("count must be greater than or equal 0."); } // A 组初始化时给定 count,B 组初始化时不给定 count StringBuilder sb = new StringBuilder(count); for(int i = 0; i < count; i++) { sb.append(' '); // C 组使用字符空格,S 组使用字符串空格 } return sb.toString(); }
从上面的测试结果可以看出,使有不同的方法生成空格的效率有很大的差别,以 char[] 的
执行速度最快。
● StringBuilder 和 StringBuffer 两者由于同步的原因也有不小的差别。
● 由于生成的空格数量是已知的,对于 StringBuilder 和 StringBuffer 的影响是非常大的。
执行速度相差在 50% 以上。
● append 添加空格时,对于空格的选择也很有讲究。空格属于单字符,采用 char 类型和 String
执行速度相差也在 50% 以上。
对于生成固定长度空格的方法选择来说,使用 char[], StringBuffer, StringBuilder 哪一种,
如选择后两者,如果容量是已经知的我们得选择对其容量进行初始化,如果是单字符时应采用 char
进行 append。
当然了,对于 StringBuffer, StingBuilder 来说,算法还可以再进行优化,比如:添加 10000 个
长度的空格的话,可以先添加 100 个生成一个字符串,然后再添加 100 次这个字符串,这时的效率会
有大幅度地提升(经实验 StringBuilder A-C 测试时间为 186928,比原来 217095 提升了 13% 的
速度)。由于生成的空格数量是不定的,在倍数选择以及非整数倍时需要精心地进行处理。