public void MeasureTimerOverhead_Stopwatch()
        {
            var minDiff = TimerMeasurer.MeasureOverhead(new StopwatchTimer());

            // The call to Now itself takes time so precision is often many ticks e.g. 100
            _output.WriteLine(minDiff.ToString());
        }
        public void MeasureMinOverhead_Random()
        {
            int min   = 3;
            var timer = new RandomStepTimer(17, 3, 42);

            var m = TimerMeasurer.MeasureOverhead(timer);

            Assert.Equal(min, m.Value);
        }
        public void MeasureMinOverhead_ConstantStep()
        {
            long step  = 17;
            var  timer = new ConstantStepTimer()
            {
                Step = step
            };

            var m = TimerMeasurer.MeasureOverhead(timer);

            Assert.Equal(step, m.Value);
        }
 private void MeasureTimerPrecision <TTimer>(TTimer timer)
     where TTimer : ITimer
 {
     for (int i = 0; i < 10; i++)
     {
         TimerMeasurer.MeasurePrecision(timer, m_precisionMeasurements);
         m_precisionMeasurements.Sort();
         var min    = m_precisionMeasurements.First();
         var median = m_precisionMeasurements.Middle();
         var max    = m_precisionMeasurements.Last();
         _output.WriteLine($"Precision {min} - {median} - {max} ticks");
     }
 }
        public void MeasurePrecision_Random()
        {
            int min          = 3;
            int max          = 42;
            var timer        = new RandomStepTimer(17, min, max);
            var measurements = new Ticks[53];

            TimerMeasurer.MeasurePrecision(timer, new ArraySegment <Ticks>(measurements));

            foreach (var m in measurements)
            {
                Assert.InRange(m.Value, min, max);
            }
        }
        public void MeasurePrecision_ConstantStep()
        {
            long step  = 17;
            var  timer = new ConstantStepTimer()
            {
                Step = step
            };
            var measurements = new Ticks[53];

            TimerMeasurer.MeasurePrecision(timer, new ArraySegment <Ticks>(measurements));

            foreach (var m in measurements)
            {
                Assert.Equal(step, m.Value);
            }
        }
Exemple #7
0
        public QuickPerfMeasurements Run(Action <string> log)//<T>(this QuickPerfConfig<T> config)
        {
            Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime;
            Thread.CurrentThread.Priority = ThreadPriority.Highest;

            var timer     = new StopwatchTimer();
            var timerSpec = timer.Spec;
            Func <double, double> toNs = ticks => 1000 * 1000 * 1000 * ticks / (double)timerSpec.Frequency;

            const int MinTicksExtraMultiplier = 40;
            const int PrecisionDigits         = 3;
            int       precisionMultiplier     = 1;

            for (int i = 0; i < PrecisionDigits; i++)
            {
                precisionMultiplier *= 10;
            }
            const int precisionMeasurementCount          = 11;
            const int measurementsPerParamPerMethodCount = 21;

            // Measure timer precision
            var precisionMeasurements = ReserveMeasurements(precisionMeasurementCount);

            TimerMeasurer.MeasurePrecision(timer, precisionMeasurements);
            precisionMeasurements.Sort();
            var min    = precisionMeasurements.First();
            var median = precisionMeasurements.Middle();
            var max    = precisionMeasurements.Last();

            log?.Invoke($"Precision {min} - {median} - {max} ticks");

            var minTicksForMeasurement = median * precisionMultiplier * MinTicksExtraMultiplier;

            foreach (var param in m_params)
            {
                // TODO: When to do
                m_setup?.Invoke(param);

                foreach (var namedMethod in m_methods)
                {
                    var method       = namedMethod.Method;
                    var methodAction = new DelegateAction(method);
                    var idleAction   = new DelegateAction(IdleAction);
                    // Pre-JIT and warmup
                    var warmupIdleTime = Measurer.MeasureDiffOutsideLoop(timer, idleAction, 3);
                    var warmupTime     = Measurer.MeasureDiffOutsideLoop(timer, methodAction, 3);

                    ForceAndWaitForGarbageCollection();
                    var iterationCount = FindIterationCount(timer, method, minTicksForMeasurement, log);

                    //ForceAndWaitForGarbageCollection();
                    var idleTime = Measurer.MeasureDiffOutsideLoop(timer, idleAction, iterationCount);
                    log?.Invoke($"Idle Ticks: {idleTime} ns: {toNs(idleTime / (double)iterationCount)}");

                    var measurements = ReserveMeasurements(measurementsPerParamPerMethodCount);
                    ForceAndWaitForGarbageCollection();
                    for (int i = 0; i < measurements.Count; i++)
                    {
                        //ForceAndWaitForGarbageCollection();
                        var methodTime = Measurer.MeasureDiffOutsideLoop(timer, methodAction, iterationCount);
                        measurements.Set(i, methodTime);
                        log?.Invoke($"{namedMethod.Name} Ticks: {methodTime} ns: {toNs(methodTime / (double)iterationCount)}");
                    }
                }
            }
            return(new QuickPerfMeasurements());
        }