1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty.buffer;
17
18 import io.netty.microbench.util.AbstractMicrobenchmark;
19 import org.openjdk.jmh.annotations.Benchmark;
20 import org.openjdk.jmh.annotations.Measurement;
21 import org.openjdk.jmh.annotations.Param;
22 import org.openjdk.jmh.annotations.Setup;
23 import org.openjdk.jmh.annotations.TearDown;
24 import org.openjdk.jmh.annotations.Warmup;
25
26 import java.nio.charset.Charset;
27 import java.util.Arrays;
28 import java.util.concurrent.TimeUnit;
29
30 @Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
31 @Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
32 public class ByteBufUtilDecodeStringBenchmark extends AbstractMicrobenchmark {
33
34 public enum ByteBufType {
35 DIRECT {
36 @Override
37 ByteBuf newBuffer(byte[] bytes, int length) {
38 ByteBuf buffer = Unpooled.directBuffer(length);
39 buffer.writeBytes(bytes, 0, length);
40 return buffer;
41 }
42 },
43 HEAP_OFFSET {
44 @Override
45 ByteBuf newBuffer(byte[] bytes, int length) {
46 return Unpooled.wrappedBuffer(bytes, 1, length);
47 }
48 },
49 HEAP {
50 @Override
51 ByteBuf newBuffer(byte[] bytes, int length) {
52 return Unpooled.wrappedBuffer(bytes, 0, length);
53 }
54 },
55 COMPOSITE {
56 @Override
57 ByteBuf newBuffer(byte[] bytes, int length) {
58 CompositeByteBuf buffer = Unpooled.compositeBuffer();
59 int offset = 0;
60
61 int capacity = length / 8;
62
63 while (length > 0) {
64 buffer.addComponent(true, Unpooled.wrappedBuffer(bytes, offset, Math.min(length, capacity)));
65 length -= capacity;
66 offset += capacity;
67 }
68 return buffer;
69 }
70 };
71
72 abstract ByteBuf newBuffer(byte[] bytes, int length);
73 }
74
75 @Param({ "8", "64", "1024", "10240", "1073741824" })
76 public int size;
77
78 @Param({ "US-ASCII", "UTF-8" })
79 public String charsetName;
80
81 @Param
82 public ByteBufType bufferType;
83
84 private ByteBuf buffer;
85 private Charset charset;
86
87 @Override
88 protected String[] jvmArgs() {
89
90 return new String[] { "-XX:MaxDirectMemorySize=2g", "-Xmx8g", "-Xms8g", "-Xmn6g" };
91 }
92
93 @Setup
94 public void setup() {
95 byte[] bytes = new byte[size + 2];
96 Arrays.fill(bytes, (byte) 'a');
97
98
99 buffer = bufferType.newBuffer(bytes, size);
100 charset = Charset.forName(charsetName);
101 }
102
103 @TearDown
104 public void teardown() {
105 buffer.release();
106 }
107
108 @Benchmark
109 public String decodeString() {
110 return ByteBufUtil.decodeString(buffer, buffer.readerIndex(), size, charset);
111 }
112 }