我修改了测试次数,但不是方法,这里用StringBuilder2500 at 3000时间更快!
class Trial {
StringBuilder _member = new StringBuilder(243840);
void method1() {
for (int i = 0; i < 30480; i++) {
_member.append("test");
}
}
void method2() {
final StringBuilder temp = new StringBuilder(243840);
for (int i = 0; i < 30480; i++) {
temp.append("test");
}
_member = temp;
}
public static void main(final String args[]) {
long startTime1 = System.nanoTime();
new Trial().method1();
long endTime1 = System.nanoTime();
long startTime2 = System.nanoTime();
new Trial().method2();
long endTime2 = System.nanoTime();
System.out.println(endTime1 - startTime1);
System.out.println(endTime2 - startTime2);
System.out.println("------------------");
startTime1 = System.nanoTime();
new Trial().method1();
endTime1 = System.nanoTime();
startTime2 = System.nanoTime();
new Trial().method2();
endTime2 = System.nanoTime();
System.out.println(endTime1 - startTime1);
System.out.println(endTime2 - startTime2);
}
}
输出:
method1 then method2 with += in MILLIisecond
5563
5844
............................................
5437
6344
method2 then method1 with += in MILLIisecond
4625
5969
------------------
6531
4891
=====================================================
method1 then method2 with StringBuilder in NANOsecond
3530337
2074286
------------------
2058641
1983493
.....................................................
method2 then method1 with StringBuilder in NANOsecond
3430883
1698819
------------------
2065626
2144406
从而@Andreas说是不是测试性能的好办法。
要指出的:使用StringBuilder的与声明的大小(在约书亚布洛赫的书有效的Java 项目51:当心字符串连接的性能)
- 宁愿方法2()时可能:字符串[ Builder]在它内部被宣告,并且不在外部使用
你运行过多少次测试?你是否尝试过在循环中多次运行这两个变体?您是否试过并颠倒了您的通话顺序? –
尝试使用[jmh](http://openjdk.java.net/projects/code-tools/jmh/)实施基准测试。它是由jvm开发人员设计的特殊工具。使用这个工具可以避免很多错误,而不是您自己的基准。 –
我试了10次,第二次总是跑得更快。 – simaremare