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

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

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

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

Править: Так как ответы говорят главным образом об этих двух оптимизации, которую я упомянул (встраивание и развертывание цикла), я просто хотел разъяснить, что мне интересно всего и любая оптимизация компилятора, не просто те два. Я также больше интересуюсь оптимизацией, которая может быть выполнена во время заранее компиляции, хотя оптимизация JIT представляет интерес также (хотя до немного меньшей степени).

Спасибо!

7
задан mk12 23 August 2012 в 21:10
поделиться

4 ответа

Обычно из-за такой наивности и надежды на улучшение.

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

Ссылки:

4
ответ дан 7 December 2019 в 14:34
поделиться

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

Вы можете взглянуть на это: http://www.linux-kongress.org/2009/slides/compiler_survey_felix_von_leitner.pdf

Дидье

0
ответ дан 7 December 2019 в 14:34
поделиться

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

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

0
ответ дан 7 December 2019 в 14:34
поделиться

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

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

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

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

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

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

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

0
ответ дан 7 December 2019 в 14:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: