Что такое хорошая эвристика для встраивания функций?

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

6
задан Mike 25 January 2010 в 04:50
поделиться

4 ответа

Информация о продукте. Это может помочь. Это были для известных продуктов на поиск Google.

http://www.vertica.com/

http://www.paraccel.com/

http://www.asterdata.com/index.php

-121--779121-

Wikipedia имеет A 5 пунктов об этом, с некоторыми ссылками внизу:

  • в дополнение к проблемам памяти и кэш-памяти, Другое рассмотрение является реестр давления . С точки зрения компилятора «Добавленные переменные из включенной процедуры могут потреблять дополнительные регистры, а в области, когда давление регистрации уже высока, это может привести к разливанию, что вызывает дополнительные доступа ОЗУ».

Языки с помощью JIT Compilers и Runtime Загрузка классов имеет другие компромиссы, поскольку виртуальные методы не известны статически, но JIT может собирать информацию о выполнении выполнения, такой как частота вызова метода:

  • Дизайн, реализация и оценка оптимизаций в одноразовом компилятере (для Java) переговоры о способе, встроенном статическом методах и динамически нагруженных классах и его улучшениях на производительности.

  • Практикующие дзюдо: Java в рамках динамических оптимизаций утверждает, что их «встраиваемая политика основана на информации о размере кода и профилирования. Если частота выполнения ввода метода ниже определенного порога, метод затем не включен, потому что Он рассматривается как холодный метод. Чтобы избежать взрыва кода, мы не встроим методом с размером биттекода более 25 байтов.,,,,,,,,,,,,,,,,, Во избежание вкладывания вдоль глубокой цепочки вызовов, встраивание останавливается, когда накапливаемый включенный размер байт Цепочка вызова превышает 40 байтов. Хотя у них есть информация о производительности выполнения (частота вызова метода), они все еще осторожены, чтобы избежать встрапления больших функций или цепей функций для предотвращения раздува.

Поиски на Google Scholar показывает ряд бумаг, таких как

поиск по книгам Google раскрывает довольно ряд книг с бумагами или главами о функциях, встроенных в различных контекстах.

8
ответ дан 16 December 2019 в 21:39
поделиться

Вызов функции подразумевает некоторый дополнительный код (функция Prologue, где устанавливается новый кадр стека, и функциональный эпилог, где он очищен). Если ваш компилятор видит, что код функции невелик по сравнению с прологом и эпилогом, он может решить, что он не стоит сделать фактический звонок и встроен на функцию.

Единственная выгода, которую я вижу, вызывающую функцию вместо встраивания, это связано с размером. Я думаю, что вставка функции, затем развертывание петли может привести к значительному увеличению размера.

0
ответ дан 16 December 2019 в 21:39
поделиться

в .NET находится в основном на основе размера. Измерьте размер родительской функции и функции ребенка в составленных байтах. Затем измеряйте размер комбинированной функции. Если комбинированная функция меньше, то встроение - хорошая идея.

Причина этого состоит в том, чтобы позволить максимально засунуть как можно большему количеству кода в кеш ЦП. Кэш-промывание гораздо дороже, чем звонки в современных процессорах.

0
ответ дан 16 December 2019 в 21:39
поделиться

Насколько я видел, размер функции - это единственные компоненты фактора, используемые для определения встроенного. Однако, если вы делаете оптимизацию с ориентацией в профиль (PGO), я полагаю, что компилятор может использовать другие переменные, такие как количество вызовов / времени настройки вызовов.

0
ответ дан 16 December 2019 в 21:39
поделиться
Другие вопросы по тегам:

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