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.BenchmarkMode;
21 import org.openjdk.jmh.annotations.CompilerControl;
22 import org.openjdk.jmh.annotations.GroupThreads;
23 import org.openjdk.jmh.annotations.Mode;
24 import org.openjdk.jmh.annotations.OutputTimeUnit;
25 import org.openjdk.jmh.annotations.Param;
26 import org.openjdk.jmh.annotations.Scope;
27 import org.openjdk.jmh.annotations.Setup;
28 import org.openjdk.jmh.annotations.State;
29 import org.openjdk.jmh.annotations.TearDown;
30 import org.openjdk.jmh.infra.Blackhole;
31
32 import java.util.concurrent.TimeUnit;
33
34 @State(Scope.Benchmark)
35 public class AbstractReferenceCountedByteBufBenchmark extends AbstractMicrobenchmark {
36
37 @Param({
38 "0",
39 "1",
40 "10",
41 "100",
42 "1000",
43 "10000",
44 })
45 public int delay;
46
47 AbstractReferenceCountedByteBuf buf;
48
49 @Setup
50 public void setUp() {
51 buf = (AbstractReferenceCountedByteBuf) Unpooled.buffer(1);
52 }
53
54 @TearDown
55 public void tearDown() {
56 buf.release();
57 }
58
59 @Benchmark
60 @BenchmarkMode(Mode.AverageTime)
61 @OutputTimeUnit(TimeUnit.NANOSECONDS)
62 public boolean retainReleaseUncontended() {
63 buf.retain();
64 delay();
65 return buf.release();
66 }
67
68 private void delay() {
69 if (delay > 0) {
70 Blackhole.consumeCPU(delay);
71 }
72 }
73
74 @Benchmark
75 @BenchmarkMode(Mode.AverageTime)
76 @OutputTimeUnit(TimeUnit.NANOSECONDS)
77 @CompilerControl(CompilerControl.Mode.DONT_INLINE)
78 public boolean createUseAndRelease(Blackhole useBuffer) {
79 ByteBuf unpooled = Unpooled.buffer(1);
80 useBuffer.consume(unpooled);
81 delay();
82 return unpooled.release();
83 }
84
85 @Benchmark
86 @BenchmarkMode(Mode.AverageTime)
87 @OutputTimeUnit(TimeUnit.NANOSECONDS)
88 @GroupThreads(4)
89 public boolean retainReleaseContended() {
90 buf.retain();
91 delay();
92 return buf.release();
93 }
94 }