@@ -57,6 +57,7 @@ pub(crate) struct TotalGasRow {
5757/// - `mean_new_payload_latency_ms`: arithmetic mean latency across blocks.
5858/// - `median_new_payload_latency_ms`: p50 latency across blocks.
5959/// - `p90_new_payload_latency_ms` / `p99_new_payload_latency_ms`: tail latencies across blocks.
60+ /// - `std_dev_new_payload_latency_ms`: standard deviation of latency across blocks.
6061#[ derive( Debug , Clone , Serialize ) ]
6162pub ( crate ) struct BenchmarkSummary {
6263 pub total_blocks : u64 ,
@@ -66,6 +67,7 @@ pub(crate) struct BenchmarkSummary {
6667 pub median_new_payload_latency_ms : f64 ,
6768 pub p90_new_payload_latency_ms : f64 ,
6869 pub p99_new_payload_latency_ms : f64 ,
70+ pub std_dev_new_payload_latency_ms : f64 ,
6971 pub gas_per_second : f64 ,
7072 pub blocks_per_second : f64 ,
7173 pub min_block_number : u64 ,
@@ -96,6 +98,7 @@ pub(crate) struct RefInfo {
9698/// Percent deltas are `(feature - baseline) / baseline * 100`:
9799/// - `new_payload_latency_p50_change_percent` / p90 / p99: percent changes of the respective
98100/// per-block percentiles.
101+ /// - `std_dev_change_percent`: percent change in standard deviation of newPayload latency.
99102/// - `per_block_latency_change_mean_percent` / `per_block_latency_change_median_percent` are the
100103/// mean and median of per-block percent deltas (feature vs baseline), capturing block-level
101104/// drift.
@@ -114,6 +117,7 @@ pub(crate) struct ComparisonSummary {
114117 pub new_payload_latency_p50_change_percent : f64 ,
115118 pub new_payload_latency_p90_change_percent : f64 ,
116119 pub new_payload_latency_p99_change_percent : f64 ,
120+ pub std_dev_change_percent : f64 ,
117121 pub gas_per_second_change_percent : f64 ,
118122 pub blocks_per_second_change_percent : f64 ,
119123}
@@ -335,6 +339,9 @@ impl ComparisonGenerator {
335339 let mean_new_payload_latency_ms: f64 =
336340 latencies_ms. iter ( ) . sum :: < f64 > ( ) / total_blocks as f64 ;
337341
342+ let std_dev_new_payload_latency_ms =
343+ calculate_std_dev ( & latencies_ms, mean_new_payload_latency_ms) ;
344+
338345 let mut sorted_latencies_ms = latencies_ms;
339346 sorted_latencies_ms. sort_by ( |a, b| a. partial_cmp ( b) . unwrap_or ( Ordering :: Equal ) ) ;
340347 let median_new_payload_latency_ms = percentile ( & sorted_latencies_ms, 0.5 ) ;
@@ -365,6 +372,7 @@ impl ComparisonGenerator {
365372 median_new_payload_latency_ms,
366373 p90_new_payload_latency_ms,
367374 p99_new_payload_latency_ms,
375+ std_dev_new_payload_latency_ms,
368376 gas_per_second,
369377 blocks_per_second,
370378 min_block_number,
@@ -432,6 +440,10 @@ impl ComparisonGenerator {
432440 baseline. p99_new_payload_latency_ms ,
433441 feature. p99_new_payload_latency_ms ,
434442 ) ,
443+ std_dev_change_percent : calc_percent_change (
444+ baseline. std_dev_new_payload_latency_ms ,
445+ feature. std_dev_new_payload_latency_ms ,
446+ ) ,
435447 gas_per_second_change_percent : calc_percent_change (
436448 baseline. gas_per_second ,
437449 feature. gas_per_second ,
@@ -562,6 +574,7 @@ impl ComparisonGenerator {
562574 " NewPayload Latency p99: {:+.2}%" ,
563575 summary. new_payload_latency_p99_change_percent
564576 ) ;
577+ println ! ( " NewPayload Latency std dev: {:+.2}%" , summary. std_dev_change_percent) ;
565578 println ! (
566579 " Gas/Second: {:+.2}%" ,
567580 summary. gas_per_second_change_percent
@@ -584,11 +597,12 @@ impl ComparisonGenerator {
584597 ) ;
585598 println ! ( " NewPayload latency (ms):" ) ;
586599 println ! (
587- " mean: {:.2}, p50: {:.2}, p90: {:.2}, p99: {:.2}" ,
600+ " mean: {:.2}, p50: {:.2}, p90: {:.2}, p99: {:.2}, std dev: {:.2} " ,
588601 baseline. mean_new_payload_latency_ms,
589602 baseline. median_new_payload_latency_ms,
590603 baseline. p90_new_payload_latency_ms,
591- baseline. p99_new_payload_latency_ms
604+ baseline. p99_new_payload_latency_ms,
605+ baseline. std_dev_new_payload_latency_ms
592606 ) ;
593607 if let ( Some ( start) , Some ( end) ) =
594608 ( & report. baseline . start_timestamp , & report. baseline . end_timestamp )
@@ -613,11 +627,12 @@ impl ComparisonGenerator {
613627 ) ;
614628 println ! ( " NewPayload latency (ms):" ) ;
615629 println ! (
616- " mean: {:.2}, p50: {:.2}, p90: {:.2}, p99: {:.2}" ,
630+ " mean: {:.2}, p50: {:.2}, p90: {:.2}, p99: {:.2}, std dev: {:.2} " ,
617631 feature. mean_new_payload_latency_ms,
618632 feature. median_new_payload_latency_ms,
619633 feature. p90_new_payload_latency_ms,
620- feature. p99_new_payload_latency_ms
634+ feature. p99_new_payload_latency_ms,
635+ feature. std_dev_new_payload_latency_ms
621636 ) ;
622637 if let ( Some ( start) , Some ( end) ) =
623638 ( & report. feature . start_timestamp , & report. feature . end_timestamp )
0 commit comments