/// <summary>
        /// A case where we don't have specific iteration time.
        /// </summary>
        private long RunAuto()
        {
            long   invokeCount      = TargetAccuracy.MinInvokeCount.Resolve(Resolver);
            double maxError         = TargetAccuracy.MaxStdErrRelative.Resolve(Resolver); // TODO: introduce a StdErr factor
            double minIterationTome = TimeUnit.Convert(Engine.MinIterationTimeMs, TimeUnit.Millisecond, TimeUnit.Nanosecond);

            double resolution = TargetClock.GetResolution().Nanoseconds;

            int iterationCounter = 0;

            while (true)
            {
                iterationCounter++;
                var    measurement       = RunIteration(IterationMode.Pilot, iterationCounter, invokeCount);
                double iterationTime     = measurement.Nanoseconds;
                double operationError    = 2.0 * resolution / invokeCount;         // An operation error which has arisen due to the Chronometer precision
                double operationMaxError = iterationTime / invokeCount * maxError; // Max acceptable operation error

                bool isFinished = operationError < operationMaxError && iterationTime >= minIterationTome;
                if (isFinished)
                {
                    break;
                }
                if (invokeCount >= MaxInvokeCount)
                {
                    break;
                }

                invokeCount *= 2;
            }
            WriteLine();

            return(invokeCount);
        }
Esempio n. 2
0
        /// <summary>
        /// A case where we don't have specific iteration time.
        /// </summary>
        private long RunAuto()
        {
            int unrollFactor = TargetJob.Run.UnrollFactor.Resolve(Resolver);
            Func <long, long> autocorrect = count => (count + unrollFactor - 1) / unrollFactor * unrollFactor;

            long   invokeCount      = autocorrect(TargetAccuracy.MinInvokeCount.Resolve(Resolver));
            double maxError         = TargetAccuracy.MaxStdErrRelative.Resolve(Resolver); // TODO: introduce a StdErr factor
            double minIterationTime = Engine.MinIterationTime.Nanoseconds;

            double resolution = TargetClock.GetResolution().Nanoseconds;

            int iterationCounter = 0;

            while (true)
            {
                iterationCounter++;
                var    measurement       = RunIteration(IterationMode.Pilot, iterationCounter, invokeCount, unrollFactor);
                double iterationTime     = measurement.Nanoseconds;
                double operationError    = 2.0 * resolution / invokeCount;         // An operation error which has arisen due to the Chronometer precision
                double operationMaxError = iterationTime / invokeCount * maxError; // Max acceptable operation error

                bool isFinished = operationError < operationMaxError && iterationTime >= minIterationTime;
                if (isFinished)
                {
                    break;
                }
                if (invokeCount >= MaxInvokeCount)
                {
                    break;
                }

                invokeCount *= 2;
            }
            WriteLine();

            return(invokeCount);
        }