Пример #1
0
        private static IList <Measurement> RunTarget(Func <MultiInvokeInput, Measurement> multiInvoke, long invokeCount, IterationMode iterationMode, Count iterationCount)
        {
            var measurements = new List <Measurement>();

            if (iterationCount.IsAuto)
            {
                int  iterationCounter   = 0;
                bool isIdle             = iterationMode.IsOneOf(IterationMode.IdleWarmup, IterationMode.IdleTarget);
                var  maxAcceptableError = isIdle ? TargetIdleAutoMaxAcceptableError : TargetMainAutoMaxAcceptableError;
                while (true)
                {
                    iterationCounter++;
                    var measurement = multiInvoke(new MultiInvokeInput(iterationMode, iterationCounter, invokeCount));
                    measurements.Add(measurement);
                    var statistics = new Statistics(measurements.Select(m => m.Nanoseconds));
                    var statisticsWithoutOutliers = new Statistics(statistics.WithoutOutliers());
                    if (iterationCounter >= TargetAutoMinIterationCount &&
                        statisticsWithoutOutliers.StandardError < maxAcceptableError * statisticsWithoutOutliers.Mean)
                    {
                        break;
                    }
                    if (isIdle && iterationCounter >= TargetIdleAutoMaxIterationCount)
                    {
                        break;
                    }
                }
            }
            else
            {
                for (int i = 0; i < iterationCount; i++)
                {
                    measurements.Add(multiInvoke(new MultiInvokeInput(IterationMode.MainTarget, i + 1, invokeCount)));
                }
            }
            Console.WriteLine();
            return(measurements);
        }
 public static bool IsIdle(this IterationMode mode) => mode.IsOneOf(IterationMode.IdleWarmup, IterationMode.IdleTarget);