Как современные оптимизирующие компиляторы определяют, когда следует оптимизировать?

StackOverflow https://stackoverflow.com/questions/1742688

Вопрос

Как современные оптимизирующие компиляторы определяют, когда применять определенные оптимизации, такие как развертывание цикла и встраивание кода?

Поскольку оба эти фактора влияют на кеширование, наивное встраивание функций с количеством строк менее X или любая другая простая эвристика, скорее всего, приведет к созданию кода с худшей производительностью.Итак, как же с этим справляются современные компиляторы?

Мне трудно найти информацию по этому поводу (особенно информацию, которую достаточно легко понять..), лучшее, что я смог найти, это статья в Википедии.Любые подробности, ссылки на книги/статьи/документы приветствуются!

РЕДАКТИРОВАТЬ:Поскольку в ответах речь идет в основном о двух упомянутых мной оптимизациях (встраивание и развертывание цикла), я просто хотел уточнить, что меня интересуют все и любые оптимизации компилятора, а не только эти две.Меня также больше интересуют оптимизации, которые можно выполнить во время предварительной компиляции, хотя JIT-оптимизация тоже представляет интерес (хотя и в несколько меньшей степени).

Спасибо!

Это было полезно?

Решение

Обычно все равно будучи таким наивным и надеясь, что это улучшение.

Вот почему компиляция «точно в срок» является такой выигрышной стратегией.Соберите статистику, а затем оптимизируйте для общего случая.

Использованная литература:

Другие советы

Вы можете посмотреть Спираль проект.

Кроме того, оптимизация — это сложная задача в целом.Частично именно поэтому у компилятора gcc так много опций.Если вы что-то знаете о кеше и страницах, вы можете делать некоторые вещи вручную, а другие запрашивать через компилятор, но не бывает двух одинаковых машин, поэтому подход должен быть специальным.

Для краткости:Лучше, чем мы!

Вы можете посмотреть на это: http://www.linux-kongress.org/2009/slides/compiler_survey_felix_von_leitner.pdf

Дидье

Хороший вопрос.Вы спрашиваете о так называемой спекулятивной оптимизации.

Динамические компиляторы используют как статическую эвристику, так и информацию профиля.Статические компиляторы используют эвристику и (автономную) информацию профиля.Последний часто называют PGO (оптимизация, управляемая профилем).

Существует множество статей о политиках встраивания.Наиболее полным является

Эмпирическое исследование встраивания методов для JIT-компилятора Java

Также содержатся ссылки на соответствующие работы и резкая критика некоторых рассмотренных статей (обоснованная).

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

P.S.Развертывание цикла — это старая классическая штука, которая помогает только в некоторых узких циклах, выполняющих только операции обработки чисел (без вызовов и т. д.).Встраивание методов — гораздо более важная оптимизация в современных компиляторах.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top