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({
76 "8",
77 "64",
78 "1024",
79 "10240",
80 "1073741824",
81 })
82 public int size;
83
84 @Param({
85 "US-ASCII",
86 "UTF-8",
87 })
88 public String charsetName;
89
90 @Param
91 public ByteBufType bufferType;
92
93 private ByteBuf buffer;
94 private Charset charset;
95
96 @Override
97 protected String[] jvmArgs() {
98
99 return new String[] { "-XX:MaxDirectMemorySize=2g", "-Xmx8g", "-Xms8g", "-Xmn6g" };
100 }
101
102 @Setup
103 public void setup() {
104 byte[] bytes = new byte[size + 2];
105 Arrays.fill(bytes, (byte) 'a');
106
107
108 buffer = bufferType.newBuffer(bytes, size);
109 charset = Charset.forName(charsetName);
110 }
111
112 @TearDown
113 public void teardown() {
114 buffer.release();
115 }
116
117 @Benchmark
118 public String decodeString() {
119 return ByteBufUtil.decodeString(buffer, buffer.readerIndex(), size, charset);
120 }
121 }