Последовательность действий Выполняет ли .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С++ определенно делает эту оптимизацию, поэтому мне интересно, почему это несоответствие. Любые идеи?