Рассмотрение, что Вы пытаетесь только оптимизировать для скорости, что такое хорошая эвристика для решения, встроить ли функцию или нет? Очевидно размер кода должен быть важным, но является там какими-либо другими факторами, обычно используемыми, когда (говорят), что gcc или ICC определяют, встроить ли вызов функции? В области была какая-либо значительная научная работа?
Информация о продукте. Это может помочь. Это были для известных продуктов на поиск Google.
http://www.asterdata.com/index.php
-121--779121-Wikipedia имеет A 5 пунктов об этом, с некоторыми ссылками внизу:
Языки с помощью JIT Compilers и Runtime Загрузка классов имеет другие компромиссы, поскольку виртуальные методы не известны статически, но JIT может собирать информацию о выполнении выполнения, такой как частота вызова метода:
Дизайн, реализация и оценка оптимизаций в одноразовом компилятере (для Java) переговоры о способе, встроенном статическом методах и динамически нагруженных классах и его улучшениях на производительности.
Практикующие дзюдо: Java в рамках динамических оптимизаций утверждает, что их «встраиваемая политика основана на информации о размере кода и профилирования. Если частота выполнения ввода метода ниже определенного порога, метод затем не включен, потому что Он рассматривается как холодный метод. Чтобы избежать взрыва кода, мы не встроим методом с размером биттекода более 25 байтов.,,,,,,,,,,,,,,,,, Во избежание вкладывания вдоль глубокой цепочки вызовов, встраивание останавливается, когда накапливаемый включенный размер байт Цепочка вызова превышает 40 байтов. Хотя у них есть информация о производительности выполнения (частота вызова метода), они все еще осторожены, чтобы избежать встрапления больших функций или цепей функций для предотвращения раздува.
Поиски на Google Scholar показывает ряд бумаг, таких как
поиск по книгам Google раскрывает довольно ряд книг с бумагами или главами о функциях, встроенных в различных контекстах.
Справочник по проектированию компилятора: Оптимизация и генерация машинного кода имеет главу о методах статизма и машинного обучения в конструкции компилятора, с эвристикой для установки различных параметров, профилирует результаты. В этой главе ссылается на бумагу Vaswani et al Сенсильные эмпирические модели эмпирических моделей микроархитектуры для оптимизации компилятора , где они предлагают «Использование эмпирического моделирования Методы для строительства чувствительных к микроархитектуре, чувствительные модели для оптимизации компилятора ».
(некоторые другие книги говорят о включении от точки зрения программиста, такие как C ++ для игровых программистов , которые тоже разговаривают об опасностях вклада функций Часто и различия между встроенными и макросами. Компиляторы часто игнорируют встроенные запросы программиста, если они могут определить, что они будут больше вреда, чем хорошие; это может быть переопределено с макросами в качестве последнего курорта.)
Вызов функции подразумевает некоторый дополнительный код (функция Prologue, где устанавливается новый кадр стека, и функциональный эпилог, где он очищен). Если ваш компилятор видит, что код функции невелик по сравнению с прологом и эпилогом, он может решить, что он не стоит сделать фактический звонок и встроен на функцию.
Единственная выгода, которую я вижу, вызывающую функцию вместо встраивания, это связано с размером. Я думаю, что вставка функции, затем развертывание петли может привести к значительному увеличению размера.
в .NET находится в основном на основе размера. Измерьте размер родительской функции и функции ребенка в составленных байтах. Затем измеряйте размер комбинированной функции. Если комбинированная функция меньше, то встроение - хорошая идея.
Причина этого состоит в том, чтобы позволить максимально засунуть как можно большему количеству кода в кеш ЦП. Кэш-промывание гораздо дороже, чем звонки в современных процессорах.
Насколько я видел, размер функции - это единственные компоненты фактора, используемые для определения встроенного. Однако, если вы делаете оптимизацию с ориентацией в профиль (PGO), я полагаю, что компилятор может использовать другие переменные, такие как количество вызовов / времени настройки вызовов.