Collectors.joining vs StringBuilder.append

时间:2018-05-04 14:32:27

标签: java java-8 java-stream

哪一个在性能方面更好?

finalWords.stream().forEach(word -> stringBuilder.append(word).append(”,“)); 
String finalResult = stringBuilder.toString();

VS

String finalResult = finalWords.stream().collect(Collectors.joining(","));

1 个答案:

答案 0 :(得分:4)

我整理了一个小基准测试,因为我很好奇。它使用List随机生成的小写size初始化String,每个10的长度为@State(Scope.Benchmark) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) @Warmup(iterations = 5, time = 500, timeUnit = TimeUnit.MILLISECONDS) @Measurement(iterations = 10, time = 500, timeUnit = TimeUnit.MILLISECONDS) @Fork(3) public class MyBenchmark { @Param({"10", "100", "1000", "10000", "100000"}) private int size; private List<String> finalWords; @Setup(Level.Invocation) public void initialize() { finalWords = IntStream.range(0, size) .mapToObj(i -> { return ThreadLocalRandom.current() .ints(10, 'a', 'z' + 1) .mapToObj(c -> Character.toString((char) c)) .collect(Collectors.joining()); }).collect(Collectors.toList()); } public static void main(String[] args) throws Exception { org.openjdk.jmh.Main.main(args); } @Benchmark public String stringBuilder() { StringBuilder sb = new StringBuilder(); finalWords.forEach(word -> sb.append(word).append(",")); return sb.toString(); } @Benchmark public String stream() { return finalWords.stream().collect(Collectors.joining(",")); } }

Benchmark                  (size)  Mode  Cnt        Score        Error  Units
MyBenchmark.stream             10  avgt   30      242.330 ±      5.177  ns/op
MyBenchmark.stream            100  avgt   30     1426.333 ±     20.183  ns/op
MyBenchmark.stream           1000  avgt   30    30779.509 ±   1114.992  ns/op
MyBenchmark.stream          10000  avgt   30   720944.424 ±  27845.997  ns/op
MyBenchmark.stream         100000  avgt   30  7701294.456 ± 648084.759  ns/op
MyBenchmark.stringBuilder      10  avgt   30      170.566 ±      1.833  ns/op
MyBenchmark.stringBuilder     100  avgt   30     1166.153 ±     21.162  ns/op
MyBenchmark.stringBuilder    1000  avgt   30    32374.567 ±    979.288  ns/op
MyBenchmark.stringBuilder   10000  avgt   30   473022.229 ±   8982.260  ns/op
MyBenchmark.stringBuilder  100000  avgt   30  4524267.849 ± 242801.008  ns/op

结果如下:

StringBuilder

如您所见,{"inputFile": [["Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7", "Column8", "Column9", "Column10"], ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"], ["K", "L", "M", "N", "O", "P", "Q", "R", "S", "T"]]} 方法在这种情况下更快,即使我没有指定初始容量。