Какая оптимизация делает как компилятор С#, так и JIT?

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

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

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

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

Ответы

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

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