2008-09-19 9 views
13

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

ответ

19

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

  • оптимизация IL
  • JIT Native Code качества.

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

/optimize- /debug- 

Это означает неоптимизированная IL, и оптимизированный машинный код.

/optimize /debug(+/full/pdbonly) 

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

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

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

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

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

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

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

+3

+1 Ницца. Где именно в среде IDE вы устанавливаете эти значения? – Trap 2010-02-12 16:53:15