Есть ли способ получить компилятор .Net JIT или C # для оптимизации пустых циклов for? - PullRequest
11 голосов
/ 02 сентября 2011

Последовательность к Оптимизирует ли .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 было бы легко найти и оптимизировать, но очень мало зная о том, какДжиттерс работает вообще, мне любопытно, есть ли конкретная причина, по которой эта оптимизация была бы исключена.Кроме того, компилятор VC ++ определенно выполняет эту оптимизацию, поэтому мне интересно, почему это несоответствие.Есть идеи?

1 Ответ

8 голосов
/ 02 сентября 2011

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

...