Подтвердить что ты не робот

Есть ли способ получить компилятор .Net JIT или С# для оптимизации пустых петель?

Последовательность действий Выполняет ли .NET JIT оптимизацию пустых циклов?:

Следующая программа запускает пустой цикл в миллиард раз и выводит время на запуск. Это займет 700 мс на моей машине, и мне любопытно, есть ли способ заставить дрожание оптимизировать пустой цикл.

using System;

namespace ConsoleApplication1 {
    class Program {
        static void Main() {
            var start = DateTime.Now;
            for (var i = 0; i < 1000000000; i++) {}
            Console.WriteLine((DateTime.Now - start).TotalMilliseconds);
        }
    }
}

Насколько я могу сказать, ответ отрицательный, но я не знаю, есть ли скрытые параметры компилятора, которые я, возможно, не пробовал. Я убедился в компиляции в режиме деблокирования и запущен без присоединенного отладчика, но все еще 700 мс предпринимается для запуска этого пустого цикла. Я также пробовал NGEN с тем же результатом (хотя я понимаю, что он должен давать тот же скомпилированный код, что и JIT, так или иначе?). Однако я никогда раньше не использовал NGEN и не могу использовать его неправильно.

Похоже, что JIT будет легко найти и оптимизировать, но, зная очень мало о том, как работают дрожания, мне любопытно, есть ли какая-то конкретная причина, по которой эта оптимизация была бы исключена. Также компилятор VС++ определенно делает эту оптимизацию, поэтому мне интересно, почему это несоответствие. Любые идеи?

4b9b3361

Ответ 1

Нет, ни один из неудобств .NET, которых я знаю, исключает пустые для циклов. Точная причина, почему это не так ясно, оптимизатор джиттера, безусловно, знает, как сделать такие оптимизации, и легко удаляет мертвый код. Подробнее см. этот ответ. Я считаю, что это было преднамеренным, оставляя петлю на месте, возможно, для ее возможного побочного эффекта, потребляя время. Который, конечно, имеет смысл только для очень коротких циклов, чтобы реализовать спинвейт.