11const fs = require ( 'fs' ) ;
22const hdr = require ( 'hdr-histogram-js' ) ;
33
4+ // Simple accumulator for RTT stats per tick
5+ class RttAccumulator {
6+ constructor ( ) {
7+ this . reset ( ) ;
8+ }
9+
10+ reset ( ) {
11+ this . sum = 0 ;
12+ this . count = 0 ;
13+ }
14+
15+ add ( value ) {
16+ this . sum += value ;
17+ this . count ++ ;
18+ }
19+
20+ getAverage ( ) {
21+ return this . count > 0 ? this . sum / this . count : null ;
22+ }
23+ }
24+
25+ function createRttHistogram ( ) {
26+ return hdr . build ( {
27+ lowestDiscernibleValue : 1 ,
28+ highestTrackableValue : 10_000_000 ,
29+ numberOfSignificantValueDigits : 3
30+ } ) ;
31+ }
32+
433function formatRow ( row ) {
534 const widths = [ 6 , 15 , 14 , 14 , 22 , 14 ] ;
635 return row . map ( ( val , i ) => String ( val ) . padEnd ( widths [ i ] || 10 ) ) . join ( '' ) ;
@@ -18,8 +47,8 @@ function updateCLI(
1847 totalSubscribedRef ,
1948 totalPublishersRef ,
2049 messageRateTs ,
21- rttValues ,
22- rttArchive
50+ rttAccumulator ,
51+ rttHistogram
2352) {
2453 return new Promise ( ( resolve ) => {
2554 let prevTime = Date . now ( ) ;
@@ -66,12 +95,11 @@ function updateCLI(
6695 let avgRttMs = null ;
6796
6897 if ( measureRTT ) {
69- const tickRttValues = rttValues . splice ( 0 ) ;
70- if ( tickRttValues . length > 0 ) {
71- const sum = tickRttValues . reduce ( ( a , b ) => a + b , 0n ) ;
72- const avgRtt = Number ( sum ) / tickRttValues . length ;
73- avgRttMs = avgRtt / 1000 ;
98+ if ( rttAccumulator . count > 0 ) {
99+ avgRttMs = rttAccumulator . getAverage ( ) ;
74100 metrics . push ( avgRttMs . toFixed ( 3 ) ) ;
101+ // Reset accumulator after using the values
102+ rttAccumulator . reset ( ) ;
75103 } else {
76104 metrics . push ( '--' ) ;
77105 }
@@ -119,10 +147,10 @@ function writeFinalResults(
119147 totalSubscribed ,
120148 messageRateTs ,
121149 rttValues ,
122- rttArchive ,
150+ rttHistogram ,
123151 perSecondStats
124152) {
125- const duration = ( end - start ) / 1000 ;
153+ const duration = ( end - start ) / 1000 ;
126154 const messageRate = totalMessages / duration ;
127155
128156 console . log ( '#################################################' ) ;
@@ -131,7 +159,7 @@ function writeFinalResults(
131159 console . log ( `Message Rate: ${ messageRate . toFixed ( 6 ) } msg/sec` ) ;
132160
133161 const result = {
134- StartTime : Math . floor ( start / 1000 ) ,
162+ StartTime : Math . floor ( start ) ,
135163 Duration : duration ,
136164 Mode : mode ,
137165 MessageRate : messageRate ,
@@ -148,38 +176,27 @@ function writeFinalResults(
148176 } ;
149177
150178 if ( argv [ 'measure-rtt-latency' ] && ! mode . includes ( 'publish' ) ) {
151- const histogram = hdr . build ( {
152- lowestDiscernibleValue : 1 ,
153- highestTrackableValue : 10_000_000 ,
154- numberOfSignificantValueDigits : 3
155- } ) ;
156-
157- rttArchive . forEach ( ( rtt ) => {
158- const val = Number ( rtt ) ;
159- if ( val >= 0 ) histogram . recordValue ( val ) ;
160- } ) ;
161-
162- const avgRtt = histogram . mean / 1000 ;
163- const p50 = histogram . getValueAtPercentile ( 50 ) / 1000 ;
164- const p95 = histogram . getValueAtPercentile ( 95 ) / 1000 ;
165- const p99 = histogram . getValueAtPercentile ( 99 ) / 1000 ;
166- const p999 = histogram . getValueAtPercentile ( 99.9 ) / 1000 ;
179+ const avgRtt = rttHistogram . mean ;
180+ const p50 = rttHistogram . getValueAtPercentile ( 50 ) ;
181+ const p95 = rttHistogram . getValueAtPercentile ( 95 ) ;
182+ const p99 = rttHistogram . getValueAtPercentile ( 99 ) ;
183+ const p999 = rttHistogram . getValueAtPercentile ( 99.9 ) ;
167184
168185 result . RTTSummary = {
169186 AvgMs : Number ( avgRtt . toFixed ( 3 ) ) ,
170187 P50Ms : Number ( p50 . toFixed ( 3 ) ) ,
171188 P95Ms : Number ( p95 . toFixed ( 3 ) ) ,
172189 P99Ms : Number ( p99 . toFixed ( 3 ) ) ,
173190 P999Ms : Number ( p999 . toFixed ( 3 ) ) ,
174- totalCount : histogram . totalCount
191+ totalCount : rttHistogram . totalCount
175192 } ;
176193
177- console . log ( `Avg RTT ${ avgRtt . toFixed ( 3 ) } ms` ) ;
178- console . log ( `P50 RTT ${ p50 . toFixed ( 3 ) } ms` ) ;
179- console . log ( `P95 RTT ${ p95 . toFixed ( 3 ) } ms` ) ;
180- console . log ( `P99 RTT ${ p99 . toFixed ( 3 ) } ms` ) ;
181- console . log ( `P999 RTT ${ p999 . toFixed ( 3 ) } ms` ) ;
182- console . log ( `Total Messages tracked latency ${ histogram . totalCount } messages` ) ;
194+ console . log ( `Avg RTT ${ avgRtt . toFixed ( 3 ) } ms` ) ;
195+ console . log ( `P50 RTT ${ p50 . toFixed ( 3 ) } ms` ) ;
196+ console . log ( `P95 RTT ${ p95 . toFixed ( 3 ) } ms` ) ;
197+ console . log ( `P99 RTT ${ p99 . toFixed ( 3 ) } ms` ) ;
198+ console . log ( `P999 RTT ${ p999 . toFixed ( 3 ) } ms` ) ;
199+ console . log ( `Total Messages tracked latency ${ rttHistogram . totalCount } messages` ) ;
183200 }
184201
185202 console . log ( '#################################################' ) ;
@@ -192,5 +209,7 @@ function writeFinalResults(
192209
193210module . exports = {
194211 updateCLI,
195- writeFinalResults
212+ writeFinalResults,
213+ createRttHistogram,
214+ RttAccumulator
196215} ;
0 commit comments