Есть ли способ изменить компилятор .NET JIT, чтобы повысить производительность во время компиляции? - PullRequest
14 голосов
/ 19 сентября 2008

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

1 Ответ

20 голосов
/ 19 сентября 2008

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

  • оптимизация 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 будет компилироваться для всех платформ и не использовать какие-либо приемы.

...