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);