public void BenchmarkPing(int reps) {
List<int> mu_sec_pings = new List<int>();
Random my_r = new Random();
ArrayList nodes = null;
lock(_sync) {
//Make a copy
nodes = new ArrayList(_node_list);
}
Stack<Action> pings = new Stack<Action>();
for(int i = 0; i < reps; i++) {
int idx0 = my_r.Next(0, nodes.Count);
int idx1 = my_r.Next(0, nodes.Count);
Node n0 = (Node)nodes[idx0];
Node n1 = (Node)nodes[idx1];
Action ping = delegate() {
RpcManager pinger = n0.Rpc;
Channel results = new Channel(1);
results.CloseEvent += delegate(object q, EventArgs a) {
try {
object result = results.Dequeue();
RpcResult r = (RpcResult)result;
IDictionary data = (IDictionary)r.Result;
int rtt = (int)data["musec"];
//Console.WriteLine("target: {0}, rtt: {1}", data["target"], data["musec"]);
mu_sec_pings.Add(rtt);
}
catch(Exception x) {
Console.WriteLine("target: {0}, Exception: {1}", n1.Address, x);
}
if( pings.Count > 0 ) {
var next = pings.Pop();
next();
}
else {
double ave_rtt = 0;
foreach(int s in mu_sec_pings) {
ave_rtt += (double)s;
}
ave_rtt /= mu_sec_pings.Count;
double var = 0;
foreach(int s in mu_sec_pings) {
var += (ave_rtt - (double)s) * (ave_rtt - (double)s);
}
var /= mu_sec_pings.Count;
var stdev = Math.Sqrt(var);
mu_sec_pings.Sort();
var median = mu_sec_pings[ mu_sec_pings.Count / 2];
Console.WriteLine("Average: {0} Median: {1} Stdev: {2} Samples: {3} Reps: {4}",
ave_rtt, median, stdev, mu_sec_pings.Count, reps);
}
};
try {
pinger.Invoke(n0, results, "trace.GetRttTo", n1.Address.ToString());
}
catch(Exception x) {
Console.WriteLine("Exception: {0}", x);
if( pings.Count > 0 ) {
var next = pings.Pop();
next();
}
else {
double ave_rtt = 0;
foreach(int s in mu_sec_pings) {
ave_rtt += (double)s;
}
ave_rtt /= mu_sec_pings.Count;
double var = 0;
foreach(int s in mu_sec_pings) {
var += (ave_rtt - (double)s) * (ave_rtt - (double)s);
}
var /= mu_sec_pings.Count;
var stdev = Math.Sqrt(var);
mu_sec_pings.Sort();
var median = mu_sec_pings[ mu_sec_pings.Count / 2];
Console.WriteLine("Average: {0} Median: {1} Stdev: {2} Samples: {3} Reps: {4}",
ave_rtt, median, stdev, mu_sec_pings.Count, reps);
}
}
};
pings.Push(ping);
}
//Now pop off the first one and go:
var first = pings.Pop();
first();
}