package jdk.test; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Level; import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Param; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; import org.openjdk.jmh.annotations.Warmup; import java.util.concurrent.TimeUnit; @BenchmarkMode(Mode.AverageTime) @Fork(3) @Warmup(iterations = 10) @Measurement(iterations = 20) @OutputTimeUnit(TimeUnit.NANOSECONDS) public class AppendNTest { @State(Scope.Benchmark) public static class Data { @Param({"0", "1", "5", "10", "20"}) public int size; String solid; final StringBuilder sb = new StringBuilder(64); @Setup(Level.Invocation) public void beforeInvocation() { sb.setLength(0); } @Setup public void setup() { solid = ""; for (int i = size; i > 0; --i) { solid += '@'; } } } @Benchmark public void test_0_New(Data d) { d.sb.appendN('@', d.size); } @Benchmark public void test_1_Old(Data d) { for (int i = d.size; i > 0; --i) { d.sb.append('@'); } } @Benchmark public void test_2_Solid(Data d) { d.sb.append(d.solid); } @Benchmark public void test_3_Repeat(Data d) { d.sb.append(CharSequence.repetitions('@', d.size)); } }