1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.logging.log4j.perf.jmh;
19
20 import java.util.concurrent.TimeUnit;
21
22 import org.apache.logging.log4j.core.util.CachedClock;
23 import org.apache.logging.log4j.core.util.Clock;
24 import org.apache.logging.log4j.core.util.CoarseCachedClock;
25 import org.apache.logging.log4j.core.util.SystemClock;
26 import org.openjdk.jmh.annotations.BenchmarkMode;
27 import org.openjdk.jmh.annotations.GenerateMicroBenchmark;
28 import org.openjdk.jmh.annotations.Level;
29 import org.openjdk.jmh.annotations.Mode;
30 import org.openjdk.jmh.annotations.OutputTimeUnit;
31 import org.openjdk.jmh.annotations.Scope;
32 import org.openjdk.jmh.annotations.Setup;
33 import org.openjdk.jmh.annotations.State;
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 @State(Scope.Thread)
50 public class ClocksBenchmark {
51
52 Clock systemClock = new SystemClock();
53 Clock cachedClock;
54 Clock coarseCachedClock;
55 Clock fixedClock;
56 Clock fixedFinalClock;
57
58 @Setup(Level.Trial)
59 public void up() {
60 cachedClock = CachedClock.instance();
61 coarseCachedClock = CoarseCachedClock.instance();
62 fixedClock = new FixedTimeClock(System.nanoTime());
63 fixedFinalClock = new FixedFinalTimeClock(System.nanoTime());
64 }
65
66 @GenerateMicroBenchmark
67 @BenchmarkMode(Mode.SampleTime)
68 @OutputTimeUnit(TimeUnit.NANOSECONDS)
69 public void baseline() {
70 }
71
72 @GenerateMicroBenchmark
73 @BenchmarkMode(Mode.SampleTime)
74 @OutputTimeUnit(TimeUnit.NANOSECONDS)
75 public long systemCurrentTimeMillis() {
76 return System.currentTimeMillis();
77 }
78
79 @GenerateMicroBenchmark
80 @BenchmarkMode(Mode.SampleTime)
81 @OutputTimeUnit(TimeUnit.NANOSECONDS)
82 public long systemClock() {
83 return systemClock.currentTimeMillis();
84 }
85
86 @GenerateMicroBenchmark
87 @BenchmarkMode(Mode.SampleTime)
88 @OutputTimeUnit(TimeUnit.NANOSECONDS)
89 public long cachedClock() {
90 return cachedClock.currentTimeMillis();
91 }
92
93 @GenerateMicroBenchmark
94 @BenchmarkMode(Mode.SampleTime)
95 @OutputTimeUnit(TimeUnit.NANOSECONDS)
96 public long coarseCachedClock() {
97 return coarseCachedClock.currentTimeMillis();
98 }
99
100 @GenerateMicroBenchmark
101 @BenchmarkMode(Mode.SampleTime)
102 @OutputTimeUnit(TimeUnit.NANOSECONDS)
103 public long fixedClock() {
104 return fixedClock.currentTimeMillis();
105 }
106
107 @GenerateMicroBenchmark
108 @BenchmarkMode(Mode.SampleTime)
109 @OutputTimeUnit(TimeUnit.NANOSECONDS)
110 public long fixedFinalClock() {
111 return fixedFinalClock.currentTimeMillis();
112 }
113
114 private static final class FixedTimeClock implements Clock {
115 private long fixedTime;
116
117 public FixedTimeClock(long fixedTime) {
118 this.fixedTime = fixedTime;
119 }
120
121 @Override
122 public long currentTimeMillis() {
123 return fixedTime;
124 }
125 }
126
127 private static final class FixedFinalTimeClock implements Clock {
128 private final long fixedFinalTime;
129
130 public FixedFinalTimeClock(long fixedTime) {
131 this.fixedFinalTime = fixedTime;
132 }
133
134 @Override
135 public long currentTimeMillis() {
136 return fixedFinalTime;
137 }
138 }
139 }