1
2
3
4
5
6 package dev.metaschema.core.model.constraint;
7
8 import java.time.Instant;
9 import java.util.concurrent.atomic.AtomicLong;
10 import java.util.concurrent.atomic.AtomicReference;
11 import java.util.concurrent.atomic.LongAdder;
12
13 import edu.umd.cs.findbugs.annotations.NonNull;
14 import edu.umd.cs.findbugs.annotations.Nullable;
15
16
17
18
19
20
21
22
23
24
25 public class TimingRecord {
26 @NonNull
27 private final LongAdder totalTimeNs = new LongAdder();
28 @NonNull
29 private final LongAdder count = new LongAdder();
30 @NonNull
31 private final AtomicLong minTimeNs = new AtomicLong(Long.MAX_VALUE);
32 @NonNull
33 private final AtomicLong maxTimeNs = new AtomicLong(Long.MIN_VALUE);
34 @NonNull
35 private final AtomicReference<Instant> startTimestampUtc = new AtomicReference<>();
36 @NonNull
37 private final AtomicReference<Instant> endTimestampUtc = new AtomicReference<>();
38
39
40
41
42
43
44
45
46 void recordStart(@NonNull Instant startTimestamp) {
47 startTimestampUtc.accumulateAndGet(
48 startTimestamp,
49 (prev, next) -> prev == null || next.isBefore(prev) ? next : prev);
50 }
51
52
53
54
55
56
57
58
59
60
61 void recordEnd(long durationNs, @NonNull Instant endTimestamp) {
62 totalTimeNs.add(durationNs);
63 count.increment();
64 endTimestampUtc.accumulateAndGet(
65 endTimestamp,
66 (prev, next) -> prev == null || next.isAfter(prev) ? next : prev);
67
68
69 long currentMin;
70 do {
71 currentMin = minTimeNs.get();
72 if (durationNs >= currentMin) {
73 break;
74 }
75 } while (!minTimeNs.compareAndSet(currentMin, durationNs));
76
77
78 long currentMax;
79 do {
80 currentMax = maxTimeNs.get();
81 if (durationNs <= currentMax) {
82 break;
83 }
84 } while (!maxTimeNs.compareAndSet(currentMax, durationNs));
85 }
86
87
88
89
90
91
92 public long getTotalTimeNs() {
93 return totalTimeNs.sum();
94 }
95
96
97
98
99
100
101 public long getCount() {
102 return count.sum();
103 }
104
105
106
107
108
109
110
111 public long getMinTimeNs() {
112 return minTimeNs.get();
113 }
114
115
116
117
118
119
120
121 public long getMaxTimeNs() {
122 return maxTimeNs.get();
123 }
124
125
126
127
128
129
130 @Nullable
131 public Instant getStartTimestampUtc() {
132 return startTimestampUtc.get();
133 }
134
135
136
137
138
139
140 @Nullable
141 public Instant getEndTimestampUtc() {
142 return endTimestampUtc.get();
143 }
144 }