Я пишу JIT-компилятор с бэкэндом x86 и изучаю ассемблер x86 и машинный код на ходу.
Существенная проблема здесь заключается в том, что JIT-компилятор не может себе позволитьтратить огромное количество времени на микрооптимизацию.Поскольку «оптимизация» происходит во время выполнения, затраты на выполнение оптимизаций должны быть меньше, чем время, сэкономленное оптимизациями (в противном случае оптимизация становится чистой потерей производительности).
Для 80x86 существует несколько различныхПроцессоры с другим поведением / характеристиками.Если вы примете во внимание конкретные характеристики процессора, стоимость оптимизации возрастет, и вы сразу столкнетесь с барьером «стоит больше, чем вы получите».Это особенно верно для таких вещей, как «идеальное планирование инструкций».
К счастью, большинство (но не все) современных 80x86 процессоров имеют различные функции (неупорядоченный, спекулятивное выполнение, гиперпоточность) для смягчения (некоторые из) затраты производительности, вызванные "неидеальной" оптимизацией.Это приводит к тому, что дорогие оптимизации становятся менее выгодными.
Первое, что вы захотите сделать, - это определить, какие части кода следует оптимизировать, а какие - нет.Вещи, которые выполняются не часто (например, код инициализации «выполняется только один раз»), вообще не должны быть оптимизированы.Это только часто исполняемые фрагменты (например, внутренние циклы и т. Д.), Которые стоит побеспокоить.Как только вы определили часть, которая стоит оптимизировать, вопрос становится «сколько?».
Как грубое чрезмерное обобщение;Я ожидаю, что (в среднем) 90% кода вообще не стоит оптимизировать, а для 9% кода стоит только выполнить некоторую общую оптимизацию.Оставшиеся 1% (которые могли бы извлечь выгоду из обширной оптимизации в теории) в конечном итоге станут слишком большими хлопотами для разработчика JIT-компилятора на практике (и приведут к огромному кошмару сложности / проверяемости - например, «ошибки», которые существуют только тогда, когдаработает на некоторых процессорах "сценариев).