mirror of
https://github.com/shadowsocks/shadowsocks-rust.git
synced 2026-11-06 08:14:07 +00:00
Remove outliner before choosing median for ping balancer
This commit is contained in:
Generated
+424
-364
File diff suppressed because it is too large
Load Diff
+6
-6
@@ -40,10 +40,10 @@ single-threaded = []
|
||||
|
||||
[dependencies]
|
||||
log = "0.4"
|
||||
byteorder = "1.2"
|
||||
rand = "0.6"
|
||||
byteorder = "1.3"
|
||||
rand = "0.7"
|
||||
time = "0.1"
|
||||
clap = "2"
|
||||
clap = "2.33"
|
||||
env_logger = "0.6"
|
||||
openssl = { version = "0.10", optional = true }
|
||||
libc = "0.2"
|
||||
@@ -60,15 +60,15 @@ typenum = "1.10"
|
||||
qrcode = { version = "0.10", default-features = false }
|
||||
serde_urlencoded = "0.5"
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
url = "1"
|
||||
url = "2.0"
|
||||
byte_string = "1.0"
|
||||
libsodium-ffi = { version = "0.1", optional = true }
|
||||
miscreant = { version = "0.4.0-beta", optional = true }
|
||||
miscreant = { version = "0.4", optional = true }
|
||||
lru-cache = "0.1"
|
||||
dns-parser = "0.8"
|
||||
trust-dns-resolver = { version = "0.11", features = ["dns-over-rustls", "dns-over-https-rustls"] }
|
||||
spin = { version = "0.5", default-features = false }
|
||||
tokio-process = "0.2.3"
|
||||
tokio-process = "0.2"
|
||||
|
||||
[target.'cfg(unix)'.dependencies]
|
||||
tokio-signal = "0.2"
|
||||
|
||||
@@ -60,17 +60,36 @@ impl ServerLatencyInner {
|
||||
self.latency_queue.pop_front();
|
||||
}
|
||||
|
||||
self.median()
|
||||
self.representation()
|
||||
}
|
||||
|
||||
fn median(&self) -> u64 {
|
||||
fn representation(&self) -> u64 {
|
||||
if self.latency_queue.is_empty() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
let mut v = self.latency_queue.iter().cloned().collect::<Vec<u64>>();
|
||||
let sum: u64 = self.latency_queue.iter().sum();
|
||||
let avg = sum as f64 / self.latency_queue.len() as f64;
|
||||
let s_sum: u64 = self.latency_queue.iter().map(|n| *n * *n).sum();
|
||||
let dev = (s_sum as f64 / self.latency_queue.len() as f64 - avg * avg).sqrt();
|
||||
|
||||
let mut v = self
|
||||
.latency_queue
|
||||
.iter()
|
||||
.cloned()
|
||||
.filter(|n| *n as f64 >= (avg - dev) && *n as f64 <= (avg + dev))
|
||||
.collect::<Vec<u64>>();
|
||||
v.sort();
|
||||
|
||||
debug!(
|
||||
"Latency queue {:?}, avg {}, dev {}, sorted {:?}",
|
||||
self.latency_queue, avg, dev, v
|
||||
);
|
||||
|
||||
if v.is_empty() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
let mid = v.len() / 2;
|
||||
if (v.len() & 1) == 0 {
|
||||
(v[mid - 1] + v[mid]) / 2
|
||||
|
||||
Reference in New Issue
Block a user