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 "1",
39 "10",
40 "100",
41 "1000",
42 "10000",
43 })
44 public int delay;
45
46 AbstractReferenceCountedByteBuf buf;
47
48 @Setup
49 public void setUp() {
50 buf = (AbstractReferenceCountedByteBuf) Unpooled.buffer(1);
51 }
52
53 @TearDown
54 public void tearDown() {
55 buf.release();
56 }
57
58 @Benchmark
59 @BenchmarkMode(Mode.AverageTime)
60 @OutputTimeUnit(TimeUnit.NANOSECONDS)
61 public boolean retainReleaseUncontended() {
62 buf.retain();
63 Blackhole.consumeCPU(delay);
64 return buf.release();
65 }
66
67 @Benchmark
68 @BenchmarkMode(Mode.AverageTime)
69 @OutputTimeUnit(TimeUnit.NANOSECONDS)
70 @CompilerControl(CompilerControl.Mode.DONT_INLINE)
71 public boolean createUseAndRelease(Blackhole useBuffer) {
72 ByteBuf unpooled = Unpooled.buffer(1);
73 useBuffer.consume(unpooled);
74 Blackhole.consumeCPU(delay);
75 return unpooled.release();
76 }
77
78 @Benchmark
79 @BenchmarkMode(Mode.AverageTime)
80 @OutputTimeUnit(TimeUnit.NANOSECONDS)
81 @GroupThreads(4)
82 public boolean retainReleaseContended() {
83 buf.retain();
84 Blackhole.consumeCPU(delay);
85 return buf.release();
86 }
87 }