Как современные оптимизирующие компиляторы определяют, когда нужно оптимизировать? - PullRequest
7 голосов
/ 16 ноября 2009

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

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

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

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

Спасибо!

Ответы [ 4 ]

5 голосов
/ 16 ноября 2009

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

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

Ссылки:

1 голос
/ 16 ноября 2009

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

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

Есть много статей о встраиваемых политиках. Наиболее полным является

Эмпирическое исследование метода Inline для компилятора Java Just-in-Time

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

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

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

1 голос
/ 16 ноября 2009

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

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

Didier

1 голос
/ 16 ноября 2009

Вы можете посмотреть проект Spiral .

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

...