Какая оптимизация делает как компилятор С#, так и JIT?
Я продолжаю работу над своим компилятором С# для моего класса компиляторов. На данный момент я почти закончил работу над разделами "Оптимизация компилятора" в своем учебнике.
В основном, у моего учебника не было компиляции Just-In-Time в виду, когда оно было написано, и мне любопытно, какие статические, предварительные jit-оптимизации выполняются компилятором С# в сравнении с тем, что он делает во время процесс JIT?
Когда я говорю с людьми о компиляции против CLR, я обычно слышу такие вещи, как "Большая часть оптимизаций выполняется JIT".
Являются ли такие вещи, как разворачивание цикла, постоянное сгибание/распространение, переплетение команд, выполненное до-Jit компилятором С# или обрабатываемое дрожанием? Если они не обрабатываются дрожанием, то какие оптимизации делает дрожание, уникальное для компилятора "точно вовремя"?
Ответы
Ответ 1
Я могу себе представить, что существует ряд оптимизаций, которые уникальны для JIT; в частности, любая оптимизация, зависящая от среды/контекста, в которой работает приложение. (Обратите внимание, что все следующие гипотезы, я не знаю точно, что или если они действительно выполняются)
Самое скучное: JIT может оптимизироваться в зависимости от 32-битной/64-разрядной базовой ОС или даже потенциально в зависимости от точной архитектуры процессора.
Не применимо: Более интересно: JIT может оптимизировать все, что работает только в режиме отладки (например, определенный условный код), когда приложение не запускается внутри контекста отладки.
Самое интересное: JIT может оптимизировать условные ветки в классе, которые зависят только от поля readonly
, потому что по крайней мере теоретически это значение никогда не изменится во время выполнения класса.
В принципе, я бы предположил, что откладывание оптимизаций до тех пор, пока JIT, как правило, не будет, потому что во время JIT есть самая доступная информация о контексте, в котором действительно работает код, что делает возможными более значимые оптимизации.
Ответ 2
У Дэвида Нотарио есть несколько сообщений в его блоге (вы можете начать здесь, а затем пройтись по истории), но они довольно отрывочны,
Ответ 3
Я не думаю, что компилятор С# делает какие-либо оптимизации. JIT выполняет всю работу.