private List <Measurement> RunAuto(long invokeCount, IterationMode iterationMode, int unrollFactor) { var measurements = measurementsPool.Next(); var measurementsForStatistics = measurementsPool.Next(); int iterationCounter = 0; bool isIdle = iterationMode.IsIdle(); double effectiveMaxRelativeError = isIdle ? MaxIdleRelativeError : maxRelativeError; while (true) { iterationCounter++; var measurement = RunIteration(iterationMode, iterationCounter, invokeCount, unrollFactor); measurements.Add(measurement); measurementsForStatistics.Add(measurement); var statistics = MeasurementsStatistics.Calculate(measurementsForStatistics, removeOutliers); double actualError = statistics.ConfidenceInterval.Margin; double maxError1 = effectiveMaxRelativeError * statistics.Mean; double maxError2 = maxAbsoluteError?.Nanoseconds ?? double.MaxValue; double maxError = Math.Min(maxError1, maxError2); if (iterationCounter >= MinIterationCount && actualError < maxError) { break; } if (iterationCounter >= MaxIterationCount || (isIdle && iterationCounter >= MaxIdleIterationCount)) { break; } } if (!IsDiagnoserAttached) { WriteLine(); } return(measurements); }
private List <Measurement> RunAuto(long invokeCount, IterationMode iterationMode, int unrollFactor) { var measurements = measurementsPool.Next(); var measurementsForStatistics = measurementsPool.Next(); int iterationCounter = 0; bool isIdle = iterationMode.IsIdle(); double maxErrorRelative = isIdle ? MaxIdleStdErrRelative : maxStdErrRelative; while (true) { iterationCounter++; var measurement = RunIteration(iterationMode, iterationCounter, invokeCount, unrollFactor); measurements.Add(measurement); measurementsForStatistics.Add(measurement); var statistics = MeasurementsStatistics.Calculate(measurementsForStatistics, removeOutliers); double actualError = statistics.StandardError; double maxError = maxErrorRelative * statistics.Mean; if (iterationCounter >= MinIterationCount && actualError < maxError) { break; } if (iterationCounter >= MaxIterationCount || (isIdle && iterationCounter >= MaxIdleIterationCount)) { break; } } if (!IsDiagnoserAttached) { WriteLine(); } return(measurements); }