Exemple #1
0
        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,
            });
        }