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