public static Result RunTest(string label, MakePerfTest createTest, int?requestedIterations, int multiplier) { const int DefaultIterations = 21; int iterations = requestedIterations.HasValue ? requestedIterations.Value : DefaultIterations; // warm-up if (iterations > 1) { PerfTest test = createTest(); test.UntimedPrepare(); test.TimedIteration(); if (iterations > 5) { test = createTest(); test.UntimedPrepare(); test.TimedIteration(); } } double[] elapsed = new double[iterations]; for (int i = 0; i < iterations; i++) { PerfTest test = createTest(); test.UntimedPrepare(); Stopwatch timer = Stopwatch.StartNew(); for (int j = 0; j < multiplier; j++) { test.TimedIteration(); } timer.Stop(); elapsed[i] = timer.ElapsedMilliseconds / 1000d; } Array.Sort(elapsed); double sum = 0; for (int i = 0; i < iterations; i++) { sum += elapsed[i]; } double average = sum / iterations; double variance = 0; double stability = 0; for (int i = 0; i < iterations; i++) { double deviation = elapsed[i] - average; variance += deviation * deviation; double sta = Math.Max(elapsed[i], average) / Math.Min(elapsed[i], average) - 1; stability += sta * sta; } variance /= iterations; stability = Math.Sqrt(stability / iterations); double median = ((iterations & 1) != 0) ? elapsed[iterations / 2] : (elapsed[(iterations - 1) / 2] + elapsed[(iterations - 1) / 2 + 1]) / 2; return(new Result { label = label, median = median, average = average, stability = stability, iterations = iterations, sum = sum, variance = variance, data = elapsed, }); }