private static void RunAsserts(TimeSpan?maxAverage, TimeSpan?maxTotal, StopwatchExtensions.TimedExecutionSummary executionSummary, Func <TimeSpan?, string> format) { if (maxTotal.HasValue && executionSummary.Total > maxTotal.Value) { throw new Exception($"{nameof(maxTotal)}: {format(maxTotal)} exceeded. Was: {format(executionSummary.Total)}"); } if (maxAverage.HasValue && executionSummary.Average > maxAverage.Value) { throw new Exception($"{nameof(maxAverage)} exceeded"); } }
public static StopwatchExtensions.TimedExecutionSummary Execute (Action action, int iterations = 1, TimeSpan?maxAverage = null, TimeSpan?maxTotal = null, string description = "", string timeFormat = DefaultTimeFormat, int maxTries = 3) { maxAverage = maxAverage != default(TimeSpan) ? maxAverage : TimeSpan.MaxValue; maxTotal = maxTotal != default(TimeSpan) ? maxTotal : TimeSpan.MaxValue; Func <TimeSpan?, string> format = date => date?.ToString(timeFormat) ?? ""; StopwatchExtensions.TimedExecutionSummary executionSummary = null; for (int tries = 1; tries <= maxTries; tries++) { executionSummary = StopwatchExtensions.TimeExecution(action: action, iterations: iterations); try { RunAsserts(maxAverage, maxTotal, executionSummary, format); } catch (Exception e) { Debug.WriteLine($"Try: {tries} {e.GetType().FullName}: {e.Message}"); if (tries >= maxTries) { PrintSummary(iterations, maxAverage, maxTotal, description, format, executionSummary); throw; } continue; } PrintSummary(iterations, maxAverage, maxTotal, description, format, executionSummary); break; } return(executionSummary); }
private static void PrintSummary (int iterations, TimeSpan?maxAverage, TimeSpan?maxTotal, string description, Func <TimeSpan?, string> format, StopwatchExtensions.TimedExecutionSummary executionSummary) { if (iterations > 1) { Console.WriteLine( $@"Executed {iterations:N} iterations of {description} Total: {format(executionSummary.Total)} Limit: {format(maxTotal)} Average: {format (executionSummary.Average)} Limit: {format(maxAverage)}"); } else { Console.WriteLine( $@"Executed {iterations} iterations of {description} Total: {format(executionSummary.Total)} Limit: {format(maxTotal)}"); } }