@@ -34,7 +34,7 @@ pub struct ServerStatData {
34
34
/// Score's average
35
35
pub latency_mean : f64 ,
36
36
/// Score's median absolute deviation
37
- pub latency_mad : f64 ,
37
+ pub latency_mad : u32 ,
38
38
}
39
39
40
40
/// Statistic of a remote server
@@ -79,7 +79,7 @@ impl ServerStat {
79
79
fail_rate : 1.0 ,
80
80
latency_stdev : max_latency_stdev,
81
81
latency_mean : max_server_rtt as f64 ,
82
- latency_mad : max_server_rtt as f64 ,
82
+ latency_mad : max_server_rtt,
83
83
} ,
84
84
}
85
85
}
@@ -91,7 +91,7 @@ impl ServerStat {
91
91
// Normalize stdev
92
92
// let nstdev = self.data.latency_stdev / self.max_latency_stdev;
93
93
// Mormalize mad
94
- let nmad = self . data . latency_mad / self . max_server_rtt as f64 ;
94
+ let nmad = self . data . latency_mad as f64 / self . max_server_rtt as f64 ;
95
95
96
96
const SCORE_RTT_WEIGHT : f64 = 1.0 ;
97
97
const SCORE_FAIL_WEIGHT : f64 = 3.0 ;
@@ -150,9 +150,10 @@ impl ServerStat {
150
150
// Error rate
151
151
self . data . fail_rate = cerr as f64 / self . latency_queue . len ( ) as f64 ;
152
152
153
+ self . data . latency_median = self . max_server_rtt ;
153
154
self . data . latency_stdev = self . max_latency_stdev ;
154
155
self . data . latency_mean = self . max_server_rtt as f64 ;
155
- self . data . latency_mad = self . max_server_rtt as f64 ;
156
+ self . data . latency_mad = self . max_server_rtt ;
156
157
157
158
if !vlat. is_empty ( ) {
158
159
vlat. sort_unstable ( ) ;
@@ -170,30 +171,36 @@ impl ServerStat {
170
171
let n = vlat. len ( ) as f64 ;
171
172
172
173
// mean
173
- let mut total_lat = 0 ;
174
- for s in & vlat {
175
- total_lat += * s;
176
- }
174
+ let total_lat: u32 = vlat. iter ( ) . sum ( ) ;
177
175
self . data . latency_mean = total_lat as f64 / n;
178
176
179
177
// STDEV
180
- let mut acc_diff = 0.0 ;
181
- for s in & vlat {
182
- let diff = * s as f64 - self . data . latency_mean ;
183
- acc_diff += diff * diff;
184
- }
178
+ let acc_mean_diff_square: f64 = vlat
179
+ . iter ( )
180
+ . map ( |s| {
181
+ let diff = * s as f64 - self . data . latency_mean ;
182
+ diff * diff
183
+ } )
184
+ . sum ( ) ;
185
185
// Corrected Sample Standard Deviation
186
- self . data . latency_stdev = ( acc_diff / ( n - 1.0 ) ) . sqrt ( ) ;
186
+ self . data . latency_stdev = ( acc_mean_diff_square / ( n - 1.0 ) ) . sqrt ( ) ;
187
187
188
188
// MAD
189
- let mut acc_abs_diff = 0.0 ;
190
- for s in & vlat {
191
- acc_abs_diff += ( * s as f64 - self . data . latency_median as f64 ) . abs ( ) ;
192
- }
193
- self . data . latency_mad = acc_abs_diff / n;
189
+ let mut vlat_abs_diff: Vec < u32 > = vlat
190
+ . iter ( )
191
+ . map ( |s| ( * s as i32 - self . data . latency_median as i32 ) . abs ( ) as u32 )
192
+ . collect ( ) ;
193
+ vlat_abs_diff. sort_unstable ( ) ;
194
+
195
+ let abs_diff_median_mid = vlat_abs_diff. len ( ) / 2 ;
196
+ self . data . latency_mad = if vlat_abs_diff. len ( ) % 2 == 0 {
197
+ ( vlat_abs_diff[ abs_diff_median_mid] + vlat_abs_diff[ abs_diff_median_mid - 1 ] ) / 2
198
+ } else {
199
+ vlat_abs_diff[ abs_diff_median_mid]
200
+ } ;
194
201
} else {
195
202
self . data . latency_mean = vlat[ 0 ] as f64 ;
196
- self . data . latency_mad = self . data . latency_mean ; // mean = median in this case
203
+ self . data . latency_mad = 0 ;
197
204
}
198
205
}
199
206
0 commit comments