Какую оптимизацию выполняют и компилятор C #, и JIT? - PullRequest
15 голосов
/ 02 июня 2009

Я продолжаю свою работу над моим C # компилятором для моего класса компиляторов. На данный момент я почти закончил с главами по оптимизации компилятора в моем учебнике.

По большей части, мой учебник не имел в виду компиляцию Just-In-Time, когда он был написан, и мне любопытно, какие виды статической оптимизации перед JIT выполняет компилятор C # по сравнению с тем, что он делает во время процесс JIT?

Когда я разговариваю с людьми о компиляции с использованием CLR, я обычно слышу такие вещи, как «Большая часть оптимизаций выполняется JIT».

Такие вещи, как развертывание цикла, постоянное свертывание / распространение, переплетение команд, выполняются перед Jit компилятором C # или обрабатываются джиттером? Если они не обрабатываются джиттером, то какие виды оптимизации выполняет джиттер, которые являются уникальными для компилятора, работающего точно по времени?

Ответы [ 3 ]

4 голосов
/ 02 июня 2009

Я могу представить, что существует ряд оптимизаций, уникальных для JIT; в частности, любая оптимизация, которая зависит от среды / контекста, в котором выполняется приложение. (Обратите внимание, что все нижеприведенное является гипотетическим, я не знаю наверняка, который или если какой-либо из них действительно выполняется)

Самое скучное: JIT может оптимизироваться в зависимости от 32-битной / 64-битной операционной системы или даже потенциально в зависимости от конкретной архитектуры процессора.

Не применимо: Более интересно: JIT может оптимизировать все, что работает только в режиме отладки (например, определенный условный код), когда приложение не запускается в контексте отладки.

Самое интересное: JIT может оптимизировать условные ветви в классе, которые зависят только от поля readonly, потому что по крайней мере теоретически это значение никогда не изменится во время выполнения класса.

По сути, я бы предположил, что отсроченная оптимизация до JIT, как правило, была бы подходящим вариантом, потому что во время JIT имеется наибольшая доступная информация о контексте, в котором фактически выполняется код, что делает возможными более значимые оптимизации.

0 голосов
/ 02 июня 2009

Дэвид Нотарио имеет несколько постов в своем блоге (вы можете начать здесь , а затем просмотреть историю), но они довольно отрывочны.

0 голосов
/ 02 июня 2009

Я не думаю, что компилятор C # делает какие-либо оптимизации. JIT выполняет всю работу.

...