【发布时间】:2017-05-22 08:15:09
【问题描述】:
我运行了以下 JUnit 测试用例,并且能够持续获得 Stringbuffer 比 StringBuilder 更好的性能结果。我确定我在这里遗漏了一些东西,但我找不到为什么StringBuffer 的速度比StringBuilder 更快的原因。
我的测试用例是,
@Test
public void stringTest(){
String s1 = "s1";
String s2 = "s2";
for(int i=0;i<=100000;i++){
s1 = s1+s2;
}
System.out.println(s1);
}
@Test
public void stringBuilderTest(){
StringBuilder s1 = new StringBuilder("s1");
String s2 = "s2";
for(int i=0;i<=100000;i++){
s1.append(s2);
}
System.out.println(s1);
}
@Test
public void stringBufferTest(){
StringBuffer s1 = new StringBuffer("s1");
String s2 = "s2";
for(int i=0;i<=100000;i++){
s1.append(s2);
}
System.out.println(s1);
}
请查找JUnit测试结果,
正如您在上面的结果中看到的那样,stringBufferTest 案例比stringBuilderTest 案例执行得更快。我的问题是为什么会这样?我知道这在理论上是不可能的,但我是如何得到这个结果的?
更新
根据@Henry 的评论,我删除了 SysOuts,结果发生了巨大变化。
然后我将循环计数增加 100000 -> 1000000,并且能够得到一些我一直期望的实际结果,
我的新问题是,
- 为什么当我删除我的 系统输出?
- 当负载从低到高增加到 1000000 时,StringBuffer 给出 比 StringBuilder 最好的结果,这是为什么呢?
【问题讨论】:
-
您是否尝试将它们按不同的顺序放置,即在构建器之前缓冲?这可能是由于您的缓冲区使用了相同的字符串 iun 内存。
-
我会从测量中取出 println(可能花费的时间最多)。也看看stackoverflow.com/questions/504103/…
-
@Nathan 是的,我先尝试了 StringBuffer,但仍然得到相同的结果。
-
@Henry 感谢您的输入,我将再次测试。
-
@GhostCat 您链接的帖子可能包含答案,但这两个问题根本不重复?如果我有同样的问题,我根本不会看到你标记为重复的帖子。问题的答案可能是“基准无效”,并链接到您链接的帖子。目前,这显然是一个不同的问题,显示了经过研究的努力(他进行了测试),不值得重复标记。
标签: java junit benchmarking stringbuilder stringbuffer