Задать вопрос
@Jaguar_sea

Почему так работает Stopwatch?

Есть вот такой код:
static void Main()
        {
            for (int i = 2; i <= 15; i++)
            {
                Stopwatch timerForRecursiveFactorial = Stopwatch.StartNew();
                int RecursiveFactorial = ComputeFactorialRecursive(i);
                timerForRecursiveFactorial.Stop();
                long ticksSpentOnRecursiveFactorial = timerForRecursiveFactorial.ElapsedTicks;
                Console.WriteLine("Факториал вычеслен рекурсивно. Результат = " + RecursiveFactorial + ". Затрачено " + ticksSpentOnRecursiveFactorial + " тиков");

                Stopwatch timerForInterativeFactorial = Stopwatch.StartNew();
                int IterativeFactorial = ComputeFactorialIterative(i);
                timerForInterativeFactorial.Stop();
                long ticksSpentOnIterativeFactorial = timerForInterativeFactorial.ElapsedTicks;
                Console.WriteLine("Факториал вычеслен итеративно. Результат = " + IterativeFactorial + ". Затрачено " + ticksSpentOnIterativeFactorial + " тиков");

                if (ticksSpentOnIterativeFactorial < ticksSpentOnRecursiveFactorial)
                    Console.WriteLine("Победил итеративный метод");
                else
                    Console.WriteLine("Победил рекурсивный метод");
            }

            Console.ReadKey();
        }


При этом результат получаю вот такой:
Факториал вычеслен рекурсивно. Результат = 2. Затрачено 471 тиков
Факториал вычеслен итеративно. Результат = 2. Затрачено 526 тиков
Победил рекурсивный метод
Факториал вычеслен рекурсивно. Результат = 6. Затрачено 1 тиков
Факториал вычеслен итеративно. Результат = 6. Затрачено 0 тиков
Победил итеративный метод
Факториал вычеслен рекурсивно. Результат = 24. Затрачено 0 тиков
Факториал вычеслен итеративно. Результат = 24. Затрачено 1 тиков
Победил рекурсивный метод
Факториал вычеслен рекурсивно. Результат = 120. Затрачено 1 тиков
Факториал вычеслен итеративно. Результат = 120. Затрачено 1 тиков
Победил рекурсивный метод
Факториал вычеслен рекурсивно. Результат = 720. Затрачено 1 тиков
Факториал вычеслен итеративно. Результат = 720. Затрачено 1 тиков
Победил рекурсивный метод
Факториал вычеслен рекурсивно. Результат = 5040. Затрачено 1 тиков
Факториал вычеслен итеративно. Результат = 5040. Затрачено 0 тиков
Победил итеративный метод
Факториал вычеслен рекурсивно. Результат = 40320. Затрачено 1 тиков
Факториал вычеслен итеративно. Результат = 40320. Затрачено 1 тиков
Победил рекурсивный метод
Факториал вычеслен рекурсивно. Результат = 362880. Затрачено 1 тиков
Факториал вычеслен итеративно. Результат = 362880. Затрачено 0 тиков
Победил итеративный метод


Почему правильное значение тиков я получаю только при первой итерации? Что я сделал не так?
  • Вопрос задан
  • 424 просмотра
Подписаться 2 Оценить 1 комментарий
Ответ пользователя Михаил К ответам на вопрос (5)
@Sing303
Это из-за JIT компилятора, который используется в .NET
Байт-код MSIL переводится в машинный код один раз JIT компилятором и последующее выполнение этого кода намного быстрее, потому что целевой код был сформирован и кэшируются
Ответ написан