public static void MeasureStats(MessageBus bus)
{
_sw.Start();
_avgCalcStart = DateTime.UtcNow;
var resultsPath = Guid.NewGuid().ToString() + ".csv";
// File.WriteAllText(resultsPath, "Target Rate, RPS, Peak RPS, Avg RPS\n");
_rateTimer = new Timer(_ =>
{
if (_measuringRate)
{
return;
}
_measuringRate = true;
try
{
var now = DateTime.UtcNow;
var timeDiffSecs = _sw.Elapsed.TotalSeconds;
_sw.Restart();
if (timeDiffSecs <= 0)
{
return;
}
if (_exception != null)
{
Console.WriteLine("Failed With:\r\n {0}", _exception.GetBaseException());
_rateTimer.Change(-1, -1);
_rateTimer.Dispose();
_rateTimer = null;
return;
}
Console.Clear();
Console.WriteLine("Started {0} of {1} clients", _clientsRunning, _clients);
Console.WriteLine("Total Rate: {0} (mps) = {1} (mps) * {2} (clients)", TotalRate, _rate, _clients);
Console.WriteLine();
// Sends
var sends = Interlocked.Read(ref _sent);
var sendsDiff = sends - _lastSendsCount;
var sendsPerSec = sendsDiff / timeDiffSecs;
_sendsPerSecond = sendsPerSec;
_lastSendsCount = sends;
Console.WriteLine("----- SENDS -----");
var s1 = Math.Max(0, _rate - _sendsPerSecond);
Console.WriteLine("SPS: {0:N3} (diff: {1:N3}, {2:N2}%)", _sendsPerSecond, s1, s1 * 100.0 / _rate);
var s2 = Math.Max(0, _rate - _peakSendsPerSecond);
Console.WriteLine("Peak SPS: {0:N3} (diff: {1:N2} {2:N2}%)", _peakSendsPerSecond, s2, s2 * 100.0 / _rate);
var s3 = Math.Max(0, _rate - _avgSendsPerSecond);
Console.WriteLine("Avg SPS: {0:N3} (diff: {1:N3} {2:N2}%)", _avgSendsPerSecond, s3, s3 * 100.0 / _rate);
Console.WriteLine();
if (sendsPerSec < long.MaxValue && sendsPerSec > _peakSendsPerSecond)
{
Interlocked.Exchange(ref _peakSendsPerSecond, sendsPerSec);
}
_avgSendsPerSecond = _avgLastSendsCount / (now - _avgCalcStart).TotalSeconds;
// Receives
var recv = Interlocked.Read(ref _received);
var recvDiff = recv - _lastReceivedCount;
var recvPerSec = recvDiff / timeDiffSecs;
_receivesPerSecond = recvPerSec;
_lastReceivedCount = recv;
Console.WriteLine("----- RECEIVES -----");
var d1 = Math.Max(0, TotalRate - _receivesPerSecond);
Console.WriteLine("RPS: {0:N3} (diff: {1:N3}, {2:N2}%)", _receivesPerSecond, d1, d1 * 100.0 / TotalRate);
var d2 = Math.Max(0, TotalRate - _peakReceivesPerSecond);
Console.WriteLine("Peak RPS: {0:N3} (diff: {1:N3} {2:N2}%)", _peakReceivesPerSecond, d2, d2 * 100.0 / TotalRate);
var d3 = Math.Max(0, TotalRate - _avgReceivesPerSecond);
Console.WriteLine("Avg RPS: {0:N3} (diff: {1:N3} {2:N2}%)", _avgReceivesPerSecond, d3, d3 * 100.0 / TotalRate);
var d4 = Math.Max(0, _sendsPerSecond - _receivesPerSecond);
Console.WriteLine("Actual RPS: {0:N3} (diff: {1:N3} {2:N2}%)", _receivesPerSecond, d4, d4 * 100.0 / _sendsPerSecond);
if (bus != null)
{
Console.WriteLine();
Console.WriteLine("----- MESSAGE BUS -----");
Console.WriteLine("Allocated Workers: {0}", bus.AllocatedWorkers);
Console.WriteLine("BusyWorkers Workers: {0}", bus.BusyWorkers);
}
if (recvPerSec < long.MaxValue && recvPerSec > _peakReceivesPerSecond)
{
Interlocked.Exchange(ref _peakReceivesPerSecond, recvPerSec);
}
_avgReceivesPerSecond = _avgLastReceivedCount / (now - _avgCalcStart).TotalSeconds;
// File.AppendAllText(resultsPath, String.Format("{0}, {1}, {2}, {3}\n", TotalRate, _receivesPerSecond, _peakReceivesPerSecond, _avgReceivesPerSecond));
if (_runs > 0 && _runs % _stepInterval == 0)
{
_avgCalcStart = DateTime.UtcNow;
Interlocked.Exchange(ref _avgLastReceivedCount, 0);
Interlocked.Exchange(ref _avgLastSendsCount, 0);
long old = Interlocked.Read(ref _rate);
long @new = old + _step;
while (Interlocked.Exchange(ref _rate, @new) == old) { }
}
_runs++;
}
finally
{
_measuringRate = false;
}
}, null, 1000, 1000);
}