private Task<JobTaskResult> GenerateAsync(WorkerResult workerResult) { return Task.Run(() => { var result = ResultWindowItem.Parse(workerResult); var max = (int) Math.Floor(workerResult.Elapsed.TotalMilliseconds / 1000); var throughput = workerResult.Seconds .Where(r => r.Key < max && r.Value.Count > 0) .OrderBy(r => r.Key) .Select(r => new DataPoint(r.Key, r.Value.Count)); return new JobTaskResult { ResultWindowItem = result, Throughput = throughput }; }); }
public async Task Load(WorkerResult workerResult) { var taskResult = await GenerateAsync(workerResult); _resultWindowItem = taskResult.ResultWindowItem; RequestsPerSecondGraph.Draw(taskResult.Throughput, "{Y:#,0} rps"); var dataPoints = workerResult.Histogram.Select((count, i) => new DataPoint(i / 80.0 * (_resultWindowItem.Max - _resultWindowItem.Min) + _resultWindowItem.Min, count)).ToList(); HistogramGraph.Draw(dataPoints, "{X:0.000} ms"); Title = "Netling - " + _resultWindowItem.Url; ThreadsValueUserControl.Value = _resultWindowItem.Threads.ToString(); PipeliningValueUserControl.Value = _resultWindowItem.Pipelining.ToString(); ThreadAffinityValueUserControl.Value = _resultWindowItem.ThreadAffinity ? "ON" : "OFF"; RequestsValueUserControl.Value = _resultWindowItem.JobsPerSecond.ToString("#,0"); ElapsedValueUserControl.Value = $"{_resultWindowItem.ElapsedSeconds:0}"; BandwidthValueUserControl.Value = _resultWindowItem.Bandwidth.ToString("#,0"); ErrorsValueUserControl.Value = _resultWindowItem.Errors.ToString("#,0"); MedianValueUserControl.Value = string.Format(_resultWindowItem.Median > 5 ? "{0:#,0}" : "{0:0.000}", _resultWindowItem.Median); StdDevValueUserControl.Value = string.Format(_resultWindowItem.StdDev > 5 ? "{0:#,0}" : "{0:0.000}", _resultWindowItem.StdDev); MinValueUserControl.Value = string.Format(_resultWindowItem.Min > 5 ? "{0:#,0}" : "{0:0.000}", _resultWindowItem.Min); MaxValueUserControl.Value = string.Format(_resultWindowItem.Max > 5 ? "{0:#,0}" : "{0:0.000}", _resultWindowItem.Max); MinTextBlock.Text = MinValueUserControl.Value + " ms"; MaxTextBlock.Text = MaxValueUserControl.Value + " ms"; var errors = new Dictionary<string, string>(); foreach (var statusCode in workerResult.StatusCodes) { errors.Add(statusCode.Key.ToString(), statusCode.Value.ToString("#,0")); } foreach (var exception in workerResult.Exceptions) { errors.Add(exception.Key.ToString(), exception.Value.ToString("#,0")); } ErrorsListView.ItemsSource = errors; if (_sender.ResultWindowItem != null) LoadBaseline(_sender.ResultWindowItem); }
public static ResultWindowItem Parse(WorkerResult result) { return new ResultWindowItem { Url = result.Url, Threads = result.Threads, Pipelining = result.Pipelining, ThreadAffinity = result.ThreadAffinity, JobsPerSecond = result.RequestsPerSecond, ElapsedSeconds = result.Elapsed.TotalSeconds, Bandwidth = result.Bandwidth, Errors = result.Errors, Median = result.Median, StdDev = result.StdDev, Min = result.Min, Max = result.Max, }; }
private static string GetAsciiHistogram(WorkerResult workerResult) { if (workerResult.Histogram.Length == 0) return string.Empty; const string filled = "█"; const string empty = " "; var histogramText = new string[7]; var max = workerResult.Histogram.Max(); foreach (var t in workerResult.Histogram) { for (var j = 0; j < histogramText.Length; j++) { histogramText[j] += t > max / histogramText.Length * (histogramText.Length - j - 1) ? filled : empty; } } var text = string.Join("\r\n", histogramText); var minText = string.Format("{0:0.000} ms ", workerResult.Min); var maxText = string.Format(" {0:0.000} ms", workerResult.Max); text += "\r\n" + minText + new string('=', workerResult.Histogram.Length - minText.Length - maxText.Length) + maxText; return text; }
private static Task<WorkerResult> Run(Uri uri, int threads, bool threadAffinity, int pipelining, TimeSpan duration, int? count, CancellationToken cancellationToken) { return Task.Run(() => { var combinedWorkerThreadResult = QueueWorkerThreads(uri, threads, threadAffinity, pipelining, duration, count, cancellationToken); var workerResult = new WorkerResult(uri, threads, threadAffinity, pipelining, combinedWorkerThreadResult.Elapsed); workerResult.Process(combinedWorkerThreadResult); return workerResult; }); }