@@ -43,6 +43,7 @@ import { AxisDomain, Coordinate } from "recharts/types/util/types";
43
43
44
44
interface ChartProps {
45
45
computeUnits : ComputeUnits ;
46
+ maxComputeUnits : number ;
46
47
bankTileCount : number ;
47
48
}
48
49
@@ -79,33 +80,52 @@ const tickLabelWidth = 110;
79
80
const minTickCount = 3 ;
80
81
81
82
function getChartData ( computeUnits : ComputeUnits ) : ChartData [ ] {
82
- const data : ChartData [ ] = [
83
- { timestampNanos : 0 , computeUnits : 0 , activeBankCount : 0 } ,
84
- ] ;
85
-
86
- for ( let i = 0 ; i < computeUnits . compute_unit_timestamps_nanos . length ; i ++ ) {
87
- const prev = data [ data . length - 1 ] ;
88
-
89
- if (
90
- prev &&
91
- computeUnits . compute_unit_timestamps_nanos [ i - 1 ] ===
92
- computeUnits . compute_unit_timestamps_nanos [ i ]
93
- ) {
94
- prev . computeUnits += computeUnits . compute_units_deltas [ i ] ;
95
- prev . activeBankCount = computeUnits . active_bank_count [ i ] ;
96
- } else {
97
- data . push ( {
98
- timestampNanos : Number (
99
- computeUnits . compute_unit_timestamps_nanos [ i ] -
100
- computeUnits . start_timestamp_nanos ,
101
- ) ,
102
- computeUnits : prev . computeUnits + computeUnits . compute_units_deltas [ i ] ,
103
- activeBankCount : computeUnits . active_bank_count [ i ] ,
104
- } ) ;
105
- }
106
- }
107
-
108
- return data ;
83
+ const events = [
84
+ ...computeUnits . txn_start_timestamps_nanos . map ( ( timestamp , i ) => ( {
85
+ timestampNanos : timestamp ,
86
+ txn_idx : i ,
87
+ start : true ,
88
+ } ) ) ,
89
+ ...computeUnits . txn_end_timestamps_nanos . map ( ( timestamp , i ) => ( {
90
+ timestampNanos : timestamp ,
91
+ txn_idx : i ,
92
+ start : false ,
93
+ } ) ) ,
94
+ ] . sort ( ( a , b ) => Number ( a . timestampNanos - b . timestampNanos ) ) ;
95
+
96
+ const activeBanks = Array ( 64 ) . fill ( false ) ;
97
+ return events . reduce < ChartData [ ] > (
98
+ ( chartData , event , i ) => {
99
+ const txn_idx = event . txn_idx ;
100
+ const cus_delta = computeUnits . txn_landed [ txn_idx ]
101
+ ? event . start
102
+ ? computeUnits . txn_max_compute_units [ txn_idx ]
103
+ : - computeUnits . txn_max_compute_units [ txn_idx ] +
104
+ computeUnits . txn_compute_units_consumed [ txn_idx ]
105
+ : 0 ;
106
+
107
+ const prev = chartData [ chartData . length - 1 ] ;
108
+ activeBanks [ computeUnits . txn_bank_idx [ txn_idx ] ] = event . start ;
109
+ const activeBankCount = activeBanks . filter (
110
+ ( is_active ) => is_active ,
111
+ ) . length ;
112
+
113
+ if ( i > 0 && events [ i - 1 ] . timestampNanos === event . timestampNanos ) {
114
+ prev . computeUnits += cus_delta ;
115
+ prev . activeBankCount = activeBankCount ;
116
+ } else {
117
+ chartData . push ( {
118
+ timestampNanos : Number (
119
+ event . timestampNanos - computeUnits . start_timestamp_nanos ,
120
+ ) ,
121
+ computeUnits : prev . computeUnits + cus_delta ,
122
+ activeBankCount,
123
+ } ) ;
124
+ }
125
+ return chartData ;
126
+ } ,
127
+ [ { timestampNanos : 0 , computeUnits : 0 , activeBankCount : 0 } ] ,
128
+ ) ;
109
129
}
110
130
111
131
const getXTicks = memoize ( function getXTicks (
@@ -202,6 +222,7 @@ function getBankCount({
202
222
203
223
function getSegments (
204
224
computeUnits : ComputeUnits ,
225
+ maxComputeUnits : number ,
205
226
bankTileCount : number ,
206
227
xDomain : Domain ,
207
228
yDomain : Domain ,
@@ -219,24 +240,24 @@ function getSegments(
219
240
ts,
220
241
bankCount,
221
242
tEnd,
222
- maxComputeUnits : computeUnits . max_compute_units ,
243
+ maxComputeUnits : maxComputeUnits ,
223
244
} ) ;
224
245
} ;
225
246
226
247
for ( let bankCount = 1 ; bankCount <= bankTileCount ; bankCount ++ ) {
227
248
const y0Ts = getTsByCu ( {
228
249
computeUnits : yDomain [ 0 ] ,
229
250
tEnd,
230
- maxComputeUnits : computeUnits . max_compute_units ,
251
+ maxComputeUnits : maxComputeUnits ,
231
252
bankCount,
232
253
} ) ;
233
254
const t0X = withinDomain ( xDomain , y0Ts ) ? y0Ts : xDomain [ 0 ] ;
234
255
const t0Y = getCusAtTs ( t0X , bankCount ) ;
235
256
236
257
const y1Ts = getTsByCu ( {
237
- computeUnits : Math . min ( yDomain [ 1 ] , computeUnits . max_compute_units ) ,
258
+ computeUnits : Math . min ( yDomain [ 1 ] , maxComputeUnits ) ,
238
259
tEnd,
239
- maxComputeUnits : computeUnits . max_compute_units ,
260
+ maxComputeUnits : maxComputeUnits ,
240
261
bankCount,
241
262
} ) ;
242
263
@@ -287,7 +308,11 @@ function getPolygonPoints(
287
308
return resPoints ;
288
309
}
289
310
290
- export default function Chart ( { computeUnits, bankTileCount } : ChartProps ) {
311
+ export default function Chart ( {
312
+ computeUnits,
313
+ maxComputeUnits,
314
+ bankTileCount,
315
+ } : ChartProps ) {
291
316
const isMouseDownRef = useRef ( false ) ;
292
317
const [ isModKeyDown , setIsModKeyDown ] = useState ( false ) ;
293
318
const [ isPanning , setIsPanning ] = useState ( false ) ;
@@ -352,20 +377,25 @@ export default function Chart({ computeUnits, bankTileCount }: ChartProps) {
352
377
353
378
const cuDomain = useMemo (
354
379
( ) =>
355
- fitYToData
356
- ? getDataDomain ( data , computeUnits . max_compute_units , zoomRange )
357
- : undefined ,
358
- [ computeUnits . max_compute_units , data , fitYToData , zoomRange ] ,
380
+ fitYToData ? getDataDomain ( data , maxComputeUnits , zoomRange ) : undefined ,
381
+ [ maxComputeUnits , data , fitYToData , zoomRange ] ,
359
382
) ;
360
383
361
384
const yDomain = useMemo < Domain > (
362
- ( ) => cuDomain ?? [ 0 , computeUnits . max_compute_units + 1_000_000 ] ,
363
- [ computeUnits . max_compute_units , cuDomain ] ,
385
+ ( ) => cuDomain ?? [ 0 , maxComputeUnits + 1_000_000 ] ,
386
+ [ maxComputeUnits , cuDomain ] ,
364
387
) ;
365
388
366
389
const segments = useMemo (
367
- ( ) => getSegments ( computeUnits , bankTileCount , xDomain , yDomain ) ,
368
- [ bankTileCount , computeUnits , xDomain , yDomain ] ,
390
+ ( ) =>
391
+ getSegments (
392
+ computeUnits ,
393
+ maxComputeUnits ,
394
+ bankTileCount ,
395
+ xDomain ,
396
+ yDomain ,
397
+ ) ,
398
+ [ bankTileCount , computeUnits , maxComputeUnits , xDomain , yDomain ] ,
369
399
) ;
370
400
371
401
const activeBankCountTicks = new Array ( bankTileCount )
@@ -694,12 +724,7 @@ export default function Chart({ computeUnits, bankTileCount }: ChartProps) {
694
724
const useActiveBanksMdStroke =
695
725
! useActiveBanksLargeStroke && xDomain [ 1 ] - xDomain [ 0 ] < mdNanosThreshold ;
696
726
697
- const tEnd =
698
- 0.95 *
699
- Number (
700
- computeUnits . target_end_timestamp_nanos -
701
- computeUnits . start_timestamp_nanos ,
702
- ) ;
727
+ const tEnd = 0.95 * slotDurationNanos ;
703
728
704
729
const prevPolyPoints = useRef < [ Coordinate , Coordinate ] [ ] > ( [ ] ) ;
705
730
prevPolyPoints . current = [ ] ;
@@ -770,7 +795,7 @@ export default function Chart({ computeUnits, bankTileCount }: ChartProps) {
770
795
x1 = { xDomain [ 0 ] }
771
796
x2 = { xDomain [ 1 ] }
772
797
y1 = { yDomain [ 0 ] }
773
- y2 = { Math . min ( yDomain [ 1 ] , computeUnits . max_compute_units ) }
798
+ y2 = { Math . min ( yDomain [ 1 ] , maxComputeUnits ) }
774
799
shape = { ( props ) => {
775
800
graphRectProps . current = props as RectangleProps ;
776
801
return < > </ > ;
@@ -835,7 +860,7 @@ export default function Chart({ computeUnits, bankTileCount }: ChartProps) {
835
860
computeUnits : yDomain [ 1 ] - yDomain [ 0 ] + yDomain [ 0 ] ,
836
861
ts : xDomain [ 1 ] - xDomain [ 0 ] + xDomain [ 0 ] ,
837
862
tEnd,
838
- maxComputeUnits : computeUnits . max_compute_units ,
863
+ maxComputeUnits : maxComputeUnits ,
839
864
} ) ,
840
865
) ,
841
866
) ;
@@ -884,7 +909,7 @@ export default function Chart({ computeUnits, bankTileCount }: ChartProps) {
884
909
} }
885
910
/>
886
911
< ReferenceLine
887
- y = { computeUnits . max_compute_units }
912
+ y = { maxComputeUnits }
888
913
stroke = "#2a7edf"
889
914
strokeDasharray = "3 3"
890
915
yAxisId = { cuAxisId }
0 commit comments