Есть ли способ изменить компилятор .NET JIT в пользу производительности за время компиляции?

Мне было интересно, есть ли способ изменить поведение компилятора .NET JIT, указав предпочтение более глубокой оптимизации. В противном случае было бы неплохо, если бы он мог сделать какую-то оптимизацию на основе профиля, если этого еще не было.

Ответы

Ответ 1

Это задается при компиляции сборки. Существует два типа оптимизаций:

  • Оптимизация IL
  • Качество исходного кода JIT.

По умолчанию это

 /optimize- /debug-

Это означает неоптимизированный IL и оптимизированный собственный код.

 /optimize /debug(+/full/pdbonly) 

Это означает неоптимизированный IL и неоптимизированный собственный код (лучшие настройки отладки).

Наконец, чтобы получить максимальную производительность:

/optimize+ /debug(-/+/full/pdbonly)

Это создает оптимизированный IL и оптимизированный собственный код.

При создании неоптимизированного IL, компилятор будет вводить инструкции NOP по всему коду. Это облегчает отладку кода, позволяя устанавливать контрольные точки для команд управления потоком, например, для, если, еще, попробовать, уловить и т.д.

CLR делает замечательную работу по оптимизации кода независимо. Когда метод JIT'ed, указатель на вызов или команда callvirt указывается непосредственно на собственный код.

Кроме того, CLR будет использовать любые трюки архитектуры, доступные при JIT'е для вашего кода. Это означает, что сборка, проходящая через JIT, будет работать быстрее, чем сборка, предварительно скомпилированная с использованием Ngen (хотя и с немного более медленным временем запуска), поскольку NGen будет компилироваться для всех платформ и не использовать какие-либо трюки.