Как современные оптимизирующие компиляторы определяют, когда следует оптимизировать?
-
20-09-2019 - |
Вопрос
Как современные оптимизирующие компиляторы определяют, когда применять определенные оптимизации, такие как развертывание цикла и встраивание кода?
Поскольку оба эти фактора влияют на кеширование, наивное встраивание функций с количеством строк менее X или любая другая простая эвристика, скорее всего, приведет к созданию кода с худшей производительностью.Итак, как же с этим справляются современные компиляторы?
Мне трудно найти информацию по этому поводу (особенно информацию, которую достаточно легко понять..), лучшее, что я смог найти, это статья в Википедии.Любые подробности, ссылки на книги/статьи/документы приветствуются!
РЕДАКТИРОВАТЬ:Поскольку в ответах речь идет в основном о двух упомянутых мной оптимизациях (встраивание и развертывание цикла), я просто хотел уточнить, что меня интересуют все и любые оптимизации компилятора, а не только эти две.Меня также больше интересуют оптимизации, которые можно выполнить во время предварительной компиляции, хотя JIT-оптимизация тоже представляет интерес (хотя и в несколько меньшей степени).
Спасибо!
Решение
Обычно все равно будучи таким наивным и надеясь, что это улучшение.
Вот почему компиляция «точно в срок» является такой выигрышной стратегией.Соберите статистику, а затем оптимизируйте для общего случая.
Использованная литература:
- http://lambda-the-ultimate.org/node/768
- GCC поддерживает Оптимизация по профилю
- И, конечно же, JVM точки доступа Sun.
Другие советы
Вы можете посмотреть Спираль проект.
Кроме того, оптимизация — это сложная задача в целом.Частично именно поэтому у компилятора gcc так много опций.Если вы что-то знаете о кеше и страницах, вы можете делать некоторые вещи вручную, а другие запрашивать через компилятор, но не бывает двух одинаковых машин, поэтому подход должен быть специальным.
Для краткости:Лучше, чем мы!
Вы можете посмотреть на это: http://www.linux-kongress.org/2009/slides/compiler_survey_felix_von_leitner.pdf
Дидье
Хороший вопрос.Вы спрашиваете о так называемой спекулятивной оптимизации.
Динамические компиляторы используют как статическую эвристику, так и информацию профиля.Статические компиляторы используют эвристику и (автономную) информацию профиля.Последний часто называют PGO (оптимизация, управляемая профилем).
Существует множество статей о политиках встраивания.Наиболее полным является
Эмпирическое исследование встраивания методов для JIT-компилятора Java
Также содержатся ссылки на соответствующие работы и резкая критика некоторых рассмотренных статей (обоснованная).
В общем, современные компиляторы стараются использовать анализ воздействия оценить потенциальный эффект спекулятивных оптимизаций перед их применением.
P.S.Развертывание цикла — это старая классическая штука, которая помогает только в некоторых узких циклах, выполняющих только операции обработки чисел (без вызовов и т. д.).Встраивание методов — гораздо более важная оптимизация в современных компиляторах.