One of the mostly asked questions is “How should I do string concatenation?”. And the answer to this question is not very straight forward. Here I would benchmark the three string concatenation operations.

Tools Used

I am using jmh to do the benchmarking. And used maven to run the benchmark code on java 8 as recommended in jmh documentation.

Benchmark String concatenation in a loop

In this example I have done string concatenation within a loop. And lets see how the output turns out.

package com.programtalk.java8.tutorial; import java.util.concurrent.TimeUnit; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.State; import org.openjdk.jmh.annotations.Warmup; @State(Scope.Thread) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MILLISECONDS) @Fork(value = 3, jvmArgsAppend = { "-server", "-disablesystemassertions" }) public class ConcatenationComparision { @Benchmark @Warmup(iterations = 10, time = 3, timeUnit = TimeUnit.SECONDS) public String stringBuilderConcatenate() { StringBuilder sb = new StringBuilder(); for (int i = 0; < 100000; i++) { sb.append("string"); } return sb.toString(); } @Benchmark @Warmup(iterations = 10, time = 3, timeUnit = TimeUnit.SECONDS) public String stringBufferConcatenate() { StringBuffer sb = new StringBuffer(); for (int i = 0; i < 100000; i++) { sb.append("string"); } return sb.toString(); } @Benchmark @Warmup(iterations = 10, time = 3, timeUnit = TimeUnit.SECONDS) public String concatenatePlusEquals() { String st = "hello"; for (int i = 0; i < 100000; i++) { st += "string"; } return st; } }

Overview of the results

Benchmark Mode Cnt Score Error Units ConcatenationComparision.concatenatePlusEquals avgt 60 11572.325 ± 104.951 ms/op ConcatenationComparision.stringBufferConcatenate avgt 60 1.471 ± 0.035 ms/op ConcatenationComparision.stringBuilderConcatenate avgt 60 1.525 ± 0.020 ms/op

So if we see the results above concatenatePlusEquals is the worst performer with 11572.325 milliseconds/operation and the other two operation take 0.035 ms/op and 0.020 ms/op. This means that “+=” operator is 11000 times less efficent than StringBuffer and StringBuilder. But don’t make up your minds now as the next example will have equally exciting results.

Full log

# JMH 1.12 (released 18 days ago) # VM version: JDK 1.8.0_77, VM 25.77-b03 # VM invoker: C:\Program Files\Java\jre1.8.0_77\bin\java.exe # VM options: -server -disablesystemassertions # Warmup: 10 iterations, 3 s each # Measurement: 20 iterations, 1 s each # Timeout: 10 min per iteration # Threads: 1 thread, will synchronize iterations # Benchmark mode: Average time, time/op # Benchmark: com.programtalk.java8.tutorial.ConcatenationComparision.concatenatePlusEquals # Run progress: 0.00% complete, ETA 00:07:30 # Fork: 1 of 3 # Warmup Iteration 1: 29026.249 ms/op # Warmup Iteration 2: 11515.075 ms/op # Warmup Iteration 3: 11625.230 ms/op # Warmup Iteration 4: 11265.016 ms/op # Warmup Iteration 5: 12201.576 ms/op # Warmup Iteration 6: 11502.628 ms/op # Warmup Iteration 7: 11404.251 ms/op # Warmup Iteration 8: 11782.064 ms/op # Warmup Iteration 9: 11176.152 ms/op # Warmup Iteration 10: 11012.261 ms/op Iteration 1: 11663.784 ms/op Iteration 2: 12123.228 ms/op Iteration 3: 11936.755 ms/op Iteration 4: 11827.529 ms/op Iteration 5: 11244.712 ms/op Iteration 6: 11809.777 ms/op Iteration 7: 12027.728 ms/op Iteration 8: 12152.749 ms/op Iteration 9: 11260.366 ms/op Iteration 10: 11470.332 ms/op Iteration 11: 11632.911 ms/op Iteration 12: 11460.662 ms/op Iteration 13: 11746.295 ms/op Iteration 14: 11453.243 ms/op Iteration 15: 11355.766 ms/op Iteration 16: 11051.642 ms/op Iteration 17: 11502.569 ms/op Iteration 18: 11686.925 ms/op Iteration 19: 11513.996 ms/op Iteration 20: 11755.533 ms/op # Run progress: 11.11% complete, ETA 00:48:45 # Fork: 2 of 3 # Warmup Iteration 1: 31015.111 ms/op # Warmup Iteration 2: 11847.680 ms/op # Warmup Iteration 3: 11187.849 ms/op # Warmup Iteration 4: 11712.085 ms/op # Warmup Iteration 5: 11746.606 ms/op # Warmup Iteration 6: 11683.458 ms/op # Warmup Iteration 7: 12043.231 ms/op # Warmup Iteration 8: 12126.888 ms/op # Warmup Iteration 9: 11803.950 ms/op # Warmup Iteration 10: 11565.470 ms/op Iteration 1: 11902.147 ms/op Iteration 2: 11516.863 ms/op Iteration 3: 11518.939 ms/op Iteration 4: 11511.284 ms/op Iteration 5: 11295.020 ms/op Iteration 6: 11677.118 ms/op Iteration 7: 11619.642 ms/op Iteration 8: 11964.386 ms/op Iteration 9: 11642.745 ms/op Iteration 10: 11717.145 ms/op Iteration 11: 11452.303 ms/op Iteration 12: 11482.042 ms/op Iteration 13: 11581.110 ms/op Iteration 14: 11654.061 ms/op Iteration 15: 11264.541 ms/op Iteration 16: 11243.485 ms/op Iteration 17: 11383.994 ms/op Iteration 18: 11506.032 ms/op Iteration 19: 11446.045 ms/op Iteration 20: 11403.822 ms/op # Run progress: 22.22% complete, ETA 00:42:47 # Fork: 3 of 3 # Warmup Iteration 1: 28695.977 ms/op # Warmup Iteration 2: 11444.238 ms/op # Warmup Iteration 3: 11664.799 ms/op # Warmup Iteration 4: 11655.362 ms/op # Warmup Iteration 5: 11561.321 ms/op # Warmup Iteration 6: 11466.525 ms/op # Warmup Iteration 7: 11413.860 ms/op # Warmup Iteration 8: 11446.732 ms/op # Warmup Iteration 9: 11537.595 ms/op # Warmup Iteration 10: 11347.037 ms/op Iteration 1: 11384.033 ms/op Iteration 2: 11460.320 ms/op Iteration 3: 11628.296 ms/op Iteration 4: 11905.415 ms/op Iteration 5: 11807.408 ms/op Iteration 6: 11305.356 ms/op Iteration 7: 11592.860 ms/op Iteration 8: 11490.144 ms/op Iteration 9: 11464.824 ms/op Iteration 10: 11637.315 ms/op Iteration 11: 11398.794 ms/op Iteration 12: 11649.445 ms/op Iteration 13: 12041.672 ms/op Iteration 14: 11541.617 ms/op Iteration 15: 11493.807 ms/op Iteration 16: 11270.454 ms/op Iteration 17: 11338.346 ms/op Iteration 18: 11419.955 ms/op Iteration 19: 11664.406 ms/op Iteration 20: 11385.820 ms/op Result "concatenatePlusEquals": 11572.325 ±(99.9%) 104.951 ms/op [Average] (min, avg, max) = (11051.642, 11572.325, 12152.749), stdev = 234.739 CI (99.9%): [11467.374, 11677.277] (assumes normal distribution) # JMH 1.12 (released 18 days ago) # VM version: JDK 1.8.0_77, VM 25.77-b03 # VM invoker: C:\Program Files\Java\jre1.8.0_77\bin\java.exe # VM options: -server -disablesystemassertions # Warmup: 10 iterations, 3 s each # Measurement: 20 iterations, 1 s each # Timeout: 10 min per iteration # Threads: 1 thread, will synchronize iterations # Benchmark mode: Average time, time/op # Benchmark: com.programtalk.java8.tutorial.ConcatenationComparision.stringBufferConcatenate # Run progress: 33.33% complete, ETA 00:36:34 # Fork: 1 of 3 # Warmup Iteration 1: 1.636 ms/op # Warmup Iteration 2: 1.406 ms/op # Warmup Iteration 3: 1.431 ms/op # Warmup Iteration 4: 1.455 ms/op # Warmup Iteration 5: 1.468 ms/op # Warmup Iteration 6: 1.437 ms/op # Warmup Iteration 7: 1.516 ms/op # Warmup Iteration 8: 1.409 ms/op # Warmup Iteration 9: 1.420 ms/op # Warmup Iteration 10: 1.438 ms/op Iteration 1: 1.520 ms/op Iteration 2: 1.435 ms/op Iteration 3: 1.402 ms/op Iteration 4: 1.511 ms/op Iteration 5: 1.405 ms/op Iteration 6: 1.413 ms/op Iteration 7: 1.451 ms/op Iteration 8: 1.437 ms/op Iteration 9: 1.432 ms/op Iteration 10: 1.443 ms/op Iteration 11: 1.415 ms/op Iteration 12: 1.408 ms/op Iteration 13: 1.431 ms/op Iteration 14: 1.431 ms/op Iteration 15: 1.427 ms/op Iteration 16: 1.467 ms/op Iteration 17: 1.407 ms/op Iteration 18: 1.401 ms/op Iteration 19: 1.406 ms/op Iteration 20: 1.402 ms/op # Run progress: 44.44% complete, ETA 00:23:54 # Fork: 2 of 3 # Warmup Iteration 1: 1.625 ms/op # Warmup Iteration 2: 1.413 ms/op # Warmup Iteration 3: 1.464 ms/op # Warmup Iteration 4: 1.414 ms/op # Warmup Iteration 5: 1.430 ms/op # Warmup Iteration 6: 1.423 ms/op # Warmup Iteration 7: 1.427 ms/op # Warmup Iteration 8: 1.443 ms/op # Warmup Iteration 9: 1.415 ms/op # Warmup Iteration 10: 1.426 ms/op Iteration 1: 1.444 ms/op Iteration 2: 1.466 ms/op Iteration 3: 1.447 ms/op Iteration 4: 1.412 ms/op Iteration 5: 1.442 ms/op Iteration 6: 1.457 ms/op Iteration 7: 1.462 ms/op Iteration 8: 1.413 ms/op Iteration 9: 1.438 ms/op Iteration 10: 1.427 ms/op Iteration 11: 1.430 ms/op Iteration 12: 1.499 ms/op Iteration 13: 1.606 ms/op Iteration 14: 1.453 ms/op Iteration 15: 1.433 ms/op Iteration 16: 1.410 ms/op Iteration 17: 1.436 ms/op Iteration 18: 1.426 ms/op Iteration 19: 1.520 ms/op Iteration 20: 1.496 ms/op # Run progress: 55.56% complete, ETA 00:15:58 # Fork: 3 of 3 # Warmup Iteration 1: 1.720 ms/op # Warmup Iteration 2: 1.507 ms/op # Warmup Iteration 3: 1.457 ms/op # Warmup Iteration 4: 1.457 ms/op # Warmup Iteration 5: 1.443 ms/op # Warmup Iteration 6: 1.507 ms/op # Warmup Iteration 7: 1.584 ms/op # Warmup Iteration 8: 1.901 ms/op # Warmup Iteration 9: 1.701 ms/op # Warmup Iteration 10: 2.060 ms/op Iteration 1: 1.866 ms/op Iteration 2: 1.684 ms/op Iteration 3: 1.490 ms/op Iteration 4: 1.636 ms/op Iteration 5: 1.507 ms/op Iteration 6: 1.450 ms/op Iteration 7: 1.466 ms/op Iteration 8: 1.443 ms/op Iteration 9: 1.481 ms/op Iteration 10: 1.448 ms/op Iteration 11: 1.500 ms/op Iteration 12: 1.609 ms/op Iteration 13: 1.545 ms/op Iteration 14: 1.469 ms/op Iteration 15: 1.522 ms/op Iteration 16: 1.488 ms/op Iteration 17: 1.443 ms/op Iteration 18: 1.471 ms/op Iteration 19: 1.492 ms/op Iteration 20: 1.502 ms/op Result "stringBufferConcatenate": 1.471 ±(99.9%) 0.035 ms/op [Average] (min, avg, max) = (1.401, 1.471, 1.866), stdev = 0.078 CI (99.9%): [1.436, 1.506] (assumes normal distribution) # JMH 1.12 (released 18 days ago) # VM version: JDK 1.8.0_77, VM 25.77-b03 # VM invoker: C:\Program Files\Java\jre1.8.0_77\bin\java.exe # VM options: -server -disablesystemassertions # Warmup: 10 iterations, 3 s each # Measurement: 20 iterations, 1 s each # Timeout: 10 min per iteration # Threads: 1 thread, will synchronize iterations # Benchmark mode: Average time, time/op # Benchmark: com.programtalk.java8.tutorial.ConcatenationComparision.stringBuilderConcatenate # Run progress: 66.67% complete, ETA 00:10:24 # Fork: 1 of 3 # Warmup Iteration 1: 1.663 ms/op # Warmup Iteration 2: 1.484 ms/op # Warmup Iteration 3: 1.528 ms/op # Warmup Iteration 4: 1.482 ms/op # Warmup Iteration 5: 1.476 ms/op # Warmup Iteration 6: 1.533 ms/op # Warmup Iteration 7: 1.533 ms/op # Warmup Iteration 8: 1.591 ms/op # Warmup Iteration 9: 1.748 ms/op # Warmup Iteration 10: 1.481 ms/op Iteration 1: 1.479 ms/op Iteration 2: 1.467 ms/op Iteration 3: 1.500 ms/op Iteration 4: 1.552 ms/op Iteration 5: 1.502 ms/op Iteration 6: 1.509 ms/op Iteration 7: 1.502 ms/op Iteration 8: 1.604 ms/op Iteration 9: 1.685 ms/op Iteration 10: 1.639 ms/op Iteration 11: 1.523 ms/op Iteration 12: 1.503 ms/op Iteration 13: 1.580 ms/op Iteration 14: 1.560 ms/op Iteration 15: 1.681 ms/op Iteration 16: 1.479 ms/op Iteration 17: 1.524 ms/op Iteration 18: 1.486 ms/op Iteration 19: 1.503 ms/op Iteration 20: 1.487 ms/op # Run progress: 77.78% complete, ETA 00:06:11 # Fork: 2 of 3 # Warmup Iteration 1: 1.665 ms/op # Warmup Iteration 2: 1.545 ms/op # Warmup Iteration 3: 1.525 ms/op # Warmup Iteration 4: 1.566 ms/op # Warmup Iteration 5: 1.545 ms/op # Warmup Iteration 6: 1.538 ms/op # Warmup Iteration 7: 1.514 ms/op # Warmup Iteration 8: 1.550 ms/op # Warmup Iteration 9: 1.538 ms/op # Warmup Iteration 10: 1.533 ms/op Iteration 1: 1.517 ms/op Iteration 2: 1.543 ms/op Iteration 3: 1.510 ms/op Iteration 4: 1.549 ms/op Iteration 5: 1.540 ms/op Iteration 6: 1.522 ms/op Iteration 7: 1.513 ms/op Iteration 8: 1.601 ms/op Iteration 9: 1.521 ms/op Iteration 10: 1.501 ms/op Iteration 11: 1.522 ms/op Iteration 12: 1.516 ms/op Iteration 13: 1.524 ms/op Iteration 14: 1.543 ms/op Iteration 15: 1.569 ms/op Iteration 16: 1.565 ms/op Iteration 17: 1.516 ms/op Iteration 18: 1.545 ms/op Iteration 19: 1.563 ms/op Iteration 20: 1.520 ms/op # Run progress: 88.89% complete, ETA 00:02:48 # Fork: 3 of 3 # Warmup Iteration 1: 1.647 ms/op # Warmup Iteration 2: 1.495 ms/op # Warmup Iteration 3: 1.494 ms/op # Warmup Iteration 4: 1.514 ms/op # Warmup Iteration 5: 1.497 ms/op # Warmup Iteration 6: 1.499 ms/op # Warmup Iteration 7: 1.537 ms/op # Warmup Iteration 8: 1.498 ms/op # Warmup Iteration 9: 1.492 ms/op # Warmup Iteration 10: 1.509 ms/op Iteration 1: 1.502 ms/op Iteration 2: 1.522 ms/op Iteration 3: 1.539 ms/op Iteration 4: 1.505 ms/op Iteration 5: 1.498 ms/op Iteration 6: 1.475 ms/op Iteration 7: 1.544 ms/op Iteration 8: 1.476 ms/op Iteration 9: 1.483 ms/op Iteration 10: 1.507 ms/op Iteration 11: 1.478 ms/op Iteration 12: 1.495 ms/op Iteration 13: 1.500 ms/op Iteration 14: 1.551 ms/op Iteration 15: 1.489 ms/op Iteration 16: 1.487 ms/op Iteration 17: 1.542 ms/op Iteration 18: 1.494 ms/op Iteration 19: 1.491 ms/op Iteration 20: 1.476 ms/op Result "stringBuilderConcatenate": 1.525 ±(99.9%) 0.020 ms/op [Average] (min, avg, max) = (1.467, 1.525, 1.685), stdev = 0.046 CI (99.9%): [1.505, 1.546] (assumes normal distribution) # Run complete. Total time: 00:23:20 Benchmark Mode Cnt Score Error Units ConcatenationComparision.concatenatePlusEquals avgt 60 11572.325 ± 104.951 ms/op ConcatenationComparision.stringBufferConcatenate avgt 60 1.471 ± 0.035 ms/op ConcatenationComparision.stringBuilderConcatenate avgt 60 1.525 ± 0.020 ms/op

Benchmark String concatenation operation

Example Code

The difference here with the code above is that I have removed the loop and have also changed the the OutputTimeUnit to microseconds so as to get meaningful results.

package com.programtalk.java8.tutorial; import java.util.concurrent.TimeUnit; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.State; import org.openjdk.jmh.annotations.Warmup; @State(Scope.Thread) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MICROSECONDS) @Fork(value = 3, jvmArgsAppend = { "-server", "-disablesystemassertions" }) public class ConcatenationComparision { @Benchmark @Warmup(iterations = 10, time = 3, timeUnit = TimeUnit.SECONDS) public String stringBuilderConcatenate() { StringBuilder sb = new StringBuilder("hello"); sb.append("string"); return sb.toString(); } @Benchmark @Warmup(iterations = 10, time = 3, timeUnit = TimeUnit.SECONDS) public String stringBufferConcatenate() { StringBuffer sb = new StringBuffer("hello"); sb.append("string"); return sb.toString(); } @Benchmark @Warmup(iterations = 10, time = 3, timeUnit = TimeUnit.SECONDS) public String concatenatePlusEquals() { String st = "hello"; return st += "string"; } }

Overview of the results

Benchmark Mode Cnt Score Error Units ConcatenationComparision.concatenatePlusEquals avgt 60 0.012 ± 0.001 us/op ConcatenationComparision.stringBufferConcatenate avgt 60 0.026 ± 0.001 us/op ConcatenationComparision.stringBuilderConcatenate avgt 60 0.026 ± 0.001 us/op

Here the results are quite different from the concatenations in loop. concatenatePlusEquals seems to do better than the other two operations.

Full log

# JMH 1.12 (released 18 days ago) # VM version: JDK 1.8.0_77, VM 25.77-b03 # VM invoker: C:\Program Files\Java\jre1.8.0_77\bin\java.exe # VM options: -server -disablesystemassertions # Warmup: 10 iterations, 3 s each # Measurement: 20 iterations, 1 s each # Timeout: 10 min per iteration # Threads: 1 thread, will synchronize iterations # Benchmark mode: Average time, time/op # Benchmark: com.programtalk.java8.tutorial.ConcatenationComparision.concatenatePlusEquals # Run progress: 0.00% complete, ETA 00:07:30 # Fork: 1 of 3 # Warmup Iteration 1: 0.014 us/op # Warmup Iteration 2: 0.012 us/op # Warmup Iteration 3: 0.012 us/op # Warmup Iteration 4: 0.012 us/op # Warmup Iteration 5: 0.012 us/op # Warmup Iteration 6: 0.012 us/op # Warmup Iteration 7: 0.012 us/op # Warmup Iteration 8: 0.012 us/op # Warmup Iteration 9: 0.012 us/op # Warmup Iteration 10: 0.012 us/op Iteration 1: 0.012 us/op Iteration 2: 0.012 us/op Iteration 3: 0.012 us/op Iteration 4: 0.012 us/op Iteration 5: 0.012 us/op Iteration 6: 0.012 us/op Iteration 7: 0.012 us/op Iteration 8: 0.012 us/op Iteration 9: 0.012 us/op Iteration 10: 0.012 us/op Iteration 11: 0.012 us/op Iteration 12: 0.012 us/op Iteration 13: 0.012 us/op Iteration 14: 0.012 us/op Iteration 15: 0.012 us/op Iteration 16: 0.012 us/op Iteration 17: 0.012 us/op Iteration 18: 0.012 us/op Iteration 19: 0.013 us/op Iteration 20: 0.012 us/op # Run progress: 11.11% complete, ETA 00:06:43 # Fork: 2 of 3 # Warmup Iteration 1: 0.014 us/op # Warmup Iteration 2: 0.012 us/op # Warmup Iteration 3: 0.012 us/op # Warmup Iteration 4: 0.012 us/op # Warmup Iteration 5: 0.012 us/op # Warmup Iteration 6: 0.012 us/op # Warmup Iteration 7: 0.012 us/op # Warmup Iteration 8: 0.012 us/op # Warmup Iteration 9: 0.012 us/op # Warmup Iteration 10: 0.012 us/op Iteration 1: 0.012 us/op Iteration 2: 0.012 us/op Iteration 3: 0.012 us/op Iteration 4: 0.012 us/op Iteration 5: 0.012 us/op Iteration 6: 0.012 us/op Iteration 7: 0.012 us/op Iteration 8: 0.012 us/op Iteration 9: 0.012 us/op Iteration 10: 0.012 us/op Iteration 11: 0.012 us/op Iteration 12: 0.012 us/op Iteration 13: 0.012 us/op Iteration 14: 0.012 us/op Iteration 15: 0.012 us/op Iteration 16: 0.012 us/op Iteration 17: 0.012 us/op Iteration 18: 0.012 us/op Iteration 19: 0.012 us/op Iteration 20: 0.012 us/op # Run progress: 22.22% complete, ETA 00:05:53 # Fork: 3 of 3 # Warmup Iteration 1: 0.014 us/op # Warmup Iteration 2: 0.012 us/op # Warmup Iteration 3: 0.012 us/op # Warmup Iteration 4: 0.012 us/op # Warmup Iteration 5: 0.012 us/op # Warmup Iteration 6: 0.012 us/op # Warmup Iteration 7: 0.012 us/op # Warmup Iteration 8: 0.012 us/op # Warmup Iteration 9: 0.012 us/op # Warmup Iteration 10: 0.012 us/op Iteration 1: 0.012 us/op Iteration 2: 0.012 us/op Iteration 3: 0.012 us/op Iteration 4: 0.012 us/op Iteration 5: 0.012 us/op Iteration 6: 0.012 us/op Iteration 7: 0.012 us/op Iteration 8: 0.012 us/op Iteration 9: 0.012 us/op Iteration 10: 0.012 us/op Iteration 11: 0.012 us/op Iteration 12: 0.012 us/op Iteration 13: 0.012 us/op Iteration 14: 0.012 us/op Iteration 15: 0.012 us/op Iteration 16: 0.012 us/op Iteration 17: 0.012 us/op Iteration 18: 0.012 us/op Iteration 19: 0.012 us/op Iteration 20: 0.012 us/op Result "concatenatePlusEquals": 0.012 ±(99.9%) 0.001 us/op [Average] (min, avg, max) = (0.012, 0.012, 0.013), stdev = 0.001 CI (99.9%): [0.012, 0.012] (assumes normal distribution) # JMH 1.12 (released 18 days ago) # VM version: JDK 1.8.0_77, VM 25.77-b03 # VM invoker: C:\Program Files\Java\jre1.8.0_77\bin\java.exe # VM options: -server -disablesystemassertions # Warmup: 10 iterations, 3 s each # Measurement: 20 iterations, 1 s each # Timeout: 10 min per iteration # Threads: 1 thread, will synchronize iterations # Benchmark mode: Average time, time/op # Benchmark: com.programtalk.java8.tutorial.ConcatenationComparision.stringBufferConcatenate # Run progress: 33.33% complete, ETA 00:05:02 # Fork: 1 of 3 # Warmup Iteration 1: 0.030 us/op # Warmup Iteration 2: 0.026 us/op # Warmup Iteration 3: 0.026 us/op # Warmup Iteration 4: 0.026 us/op # Warmup Iteration 5: 0.026 us/op # Warmup Iteration 6: 0.027 us/op # Warmup Iteration 7: 0.026 us/op # Warmup Iteration 8: 0.026 us/op # Warmup Iteration 9: 0.027 us/op # Warmup Iteration 10: 0.026 us/op Iteration 1: 0.026 us/op Iteration 2: 0.026 us/op Iteration 3: 0.025 us/op Iteration 4: 0.026 us/op Iteration 5: 0.026 us/op Iteration 6: 0.026 us/op Iteration 7: 0.026 us/op Iteration 8: 0.026 us/op Iteration 9: 0.026 us/op Iteration 10: 0.025 us/op Iteration 11: 0.026 us/op Iteration 12: 0.026 us/op Iteration 13: 0.026 us/op Iteration 14: 0.026 us/op Iteration 15: 0.026 us/op Iteration 16: 0.026 us/op Iteration 17: 0.026 us/op Iteration 18: 0.026 us/op Iteration 19: 0.026 us/op Iteration 20: 0.026 us/op # Run progress: 44.44% complete, ETA 00:04:12 # Fork: 2 of 3 # Warmup Iteration 1: 0.030 us/op # Warmup Iteration 2: 0.026 us/op # Warmup Iteration 3: 0.026 us/op # Warmup Iteration 4: 0.026 us/op # Warmup Iteration 5: 0.026 us/op # Warmup Iteration 6: 0.026 us/op # Warmup Iteration 7: 0.026 us/op # Warmup Iteration 8: 0.026 us/op # Warmup Iteration 9: 0.026 us/op # Warmup Iteration 10: 0.026 us/op Iteration 1: 0.026 us/op Iteration 2: 0.026 us/op Iteration 3: 0.026 us/op Iteration 4: 0.026 us/op Iteration 5: 0.026 us/op Iteration 6: 0.028 us/op Iteration 7: 0.026 us/op Iteration 8: 0.026 us/op Iteration 9: 0.026 us/op Iteration 10: 0.026 us/op Iteration 11: 0.026 us/op Iteration 12: 0.026 us/op Iteration 13: 0.026 us/op Iteration 14: 0.026 us/op Iteration 15: 0.026 us/op Iteration 16: 0.026 us/op Iteration 17: 0.026 us/op Iteration 18: 0.026 us/op Iteration 19: 0.026 us/op Iteration 20: 0.027 us/op # Run progress: 55.56% complete, ETA 00:03:21 # Fork: 3 of 3 # Warmup Iteration 1: 0.030 us/op # Warmup Iteration 2: 0.026 us/op # Warmup Iteration 3: 0.026 us/op # Warmup Iteration 4: 0.026 us/op # Warmup Iteration 5: 0.026 us/op # Warmup Iteration 6: 0.026 us/op # Warmup Iteration 7: 0.026 us/op # Warmup Iteration 8: 0.026 us/op # Warmup Iteration 9: 0.026 us/op # Warmup Iteration 10: 0.026 us/op Iteration 1: 0.026 us/op Iteration 2: 0.026 us/op Iteration 3: 0.026 us/op Iteration 4: 0.026 us/op Iteration 5: 0.027 us/op Iteration 6: 0.027 us/op Iteration 7: 0.026 us/op Iteration 8: 0.028 us/op Iteration 9: 0.027 us/op Iteration 10: 0.027 us/op Iteration 11: 0.026 us/op Iteration 12: 0.026 us/op Iteration 13: 0.026 us/op Iteration 14: 0.029 us/op Iteration 15: 0.026 us/op Iteration 16: 0.027 us/op Iteration 17: 0.026 us/op Iteration 18: 0.026 us/op Iteration 19: 0.027 us/op Iteration 20: 0.026 us/op Result "stringBufferConcatenate": 0.026 ±(99.9%) 0.001 us/op [Average] (min, avg, max) = (0.025, 0.026, 0.029), stdev = 0.001 CI (99.9%): [0.026, 0.026] (assumes normal distribution) # JMH 1.12 (released 18 days ago) # VM version: JDK 1.8.0_77, VM 25.77-b03 # VM invoker: C:\Program Files\Java\jre1.8.0_77\bin\java.exe # VM options: -server -disablesystemassertions # Warmup: 10 iterations, 3 s each # Measurement: 20 iterations, 1 s each # Timeout: 10 min per iteration # Threads: 1 thread, will synchronize iterations # Benchmark mode: Average time, time/op # Benchmark: com.programtalk.java8.tutorial.ConcatenationComparision.stringBuilderConcatenate # Run progress: 66.67% complete, ETA 00:02:31 # Fork: 1 of 3 # Warmup Iteration 1: 0.029 us/op # Warmup Iteration 2: 0.026 us/op # Warmup Iteration 3: 0.025 us/op # Warmup Iteration 4: 0.025 us/op # Warmup Iteration 5: 0.025 us/op # Warmup Iteration 6: 0.025 us/op # Warmup Iteration 7: 0.025 us/op # Warmup Iteration 8: 0.025 us/op # Warmup Iteration 9: 0.026 us/op # Warmup Iteration 10: 0.027 us/op Iteration 1: 0.025 us/op Iteration 2: 0.025 us/op Iteration 3: 0.028 us/op Iteration 4: 0.028 us/op Iteration 5: 0.026 us/op Iteration 6: 0.026 us/op Iteration 7: 0.025 us/op Iteration 8: 0.025 us/op Iteration 9: 0.025 us/op Iteration 10: 0.027 us/op Iteration 11: 0.026 us/op Iteration 12: 0.026 us/op Iteration 13: 0.025 us/op Iteration 14: 0.025 us/op Iteration 15: 0.025 us/op Iteration 16: 0.028 us/op Iteration 17: 0.028 us/op Iteration 18: 0.027 us/op Iteration 19: 0.025 us/op Iteration 20: 0.025 us/op # Run progress: 77.78% complete, ETA 00:01:40 # Fork: 2 of 3 # Warmup Iteration 1: 0.031 us/op # Warmup Iteration 2: 0.026 us/op # Warmup Iteration 3: 0.025 us/op # Warmup Iteration 4: 0.025 us/op # Warmup Iteration 5: 0.025 us/op # Warmup Iteration 6: 0.026 us/op # Warmup Iteration 7: 0.028 us/op # Warmup Iteration 8: 0.026 us/op # Warmup Iteration 9: 0.025 us/op # Warmup Iteration 10: 0.027 us/op Iteration 1: 0.026 us/op Iteration 2: 0.027 us/op Iteration 3: 0.025 us/op Iteration 4: 0.026 us/op Iteration 5: 0.025 us/op Iteration 6: 0.027 us/op Iteration 7: 0.026 us/op Iteration 8: 0.026 us/op Iteration 9: 0.028 us/op Iteration 10: 0.030 us/op Iteration 11: 0.026 us/op Iteration 12: 0.025 us/op Iteration 13: 0.025 us/op Iteration 14: 0.025 us/op Iteration 15: 0.025 us/op Iteration 16: 0.025 us/op Iteration 17: 0.025 us/op Iteration 18: 0.025 us/op Iteration 19: 0.025 us/op Iteration 20: 0.026 us/op # Run progress: 88.89% complete, ETA 00:00:50 # Fork: 3 of 3 # Warmup Iteration 1: 0.031 us/op # Warmup Iteration 2: 0.025 us/op # Warmup Iteration 3: 0.025 us/op # Warmup Iteration 4: 0.026 us/op # Warmup Iteration 5: 0.026 us/op # Warmup Iteration 6: 0.025 us/op # Warmup Iteration 7: 0.025 us/op # Warmup Iteration 8: 0.026 us/op # Warmup Iteration 9: 0.025 us/op # Warmup Iteration 10: 0.025 us/op Iteration 1: 0.025 us/op Iteration 2: 0.025 us/op Iteration 3: 0.025 us/op Iteration 4: 0.025 us/op Iteration 5: 0.025 us/op Iteration 6: 0.025 us/op Iteration 7: 0.025 us/op Iteration 8: 0.026 us/op Iteration 9: 0.025 us/op Iteration 10: 0.025 us/op Iteration 11: 0.025 us/op Iteration 12: 0.025 us/op Iteration 13: 0.025 us/op Iteration 14: 0.025 us/op Iteration 15: 0.027 us/op Iteration 16: 0.025 us/op Iteration 17: 0.025 us/op Iteration 18: 0.025 us/op Iteration 19: 0.025 us/op Iteration 20: 0.025 us/op Result "stringBuilderConcatenate": 0.026 ±(99.9%) 0.001 us/op [Average] (min, avg, max) = (0.025, 0.026, 0.030), stdev = 0.001 CI (99.9%): [0.025, 0.026] (assumes normal distribution) # Run complete. Total time: 00:07:34 Benchmark Mode Cnt Score Error Units ConcatenationComparision.concatenatePlusEquals avgt 60 0.012 ± 0.001 us/op ConcatenationComparision.stringBufferConcatenate avgt 60 0.026 ± 0.001 us/op ConcatenationComparision.stringBuilderConcatenate avgt 60 0.026 ± 0.001 us/op

Conclusion

So from the above tests we can conclude the following points.

If there are few strings to concatenate “+=” or “+” is better alternative as this means lesser code and hence leads to less maintenance. If there are lots of strings to concatenate then StringBuffer or StringBuilder is the better option StringBuilder is recommended for single threaded use

StringBuffer is safe in concurrent environment