Что произойдет, если функция встраивания слишком агрессивна? - PullRequest
5 голосов
/ 14 февраля 2011

Каждый раз, когда я читаю о ключевом слове inline в C ++, есть длинное объяснение, что компилятор выполняет анализ «скорость по сравнению с объемом кода», а затем решает, встроить ли вызов функции в каждом конкретном случае.

Теперь в Visual C ++ 9 есть ключевое слово __forceinline , которое, кажется, заставляет компилятор встроить вызов функции, если такое встраивание абсолютно невозможно (например, вызов виртуален).

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

Это действительно имеет значение? Какого эффекта следует ожидать от чрезмерно агрессивных функций, встроенных в сотни раз?

Ответы [ 6 ]

5 голосов
/ 14 февраля 2011

Основное влияние будет на кеш. Инлайнинг идет против принципа местности; ЦПУ будет гораздо чаще получать инструкции из основной памяти. Так что то, что должно было сделать код быстрее, на самом деле может сделать его медленнее.

4 голосов
/ 14 февраля 2011

Другие уже упоминали о влиянии на кеш.Есть еще один штраф, чтобы заплатить.Современные процессоры довольно быстрые, но по цене.У них есть глубокие конвейеры обрабатываемых инструкций.Чтобы сохранить эти конвейеры заполненными даже при наличии условных ветвлений, быстрые ЦП используют предсказание ветвлений.Они записывают, как часто брали ветку, и используют ее, чтобы предсказать, будет ли ветвь получена в будущем.

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

3 голосов
/ 14 февраля 2011

Увеличение размера исполняемого файла само по себе наказание:

1) Для хранения программы требуется больше памяти, что для некоторых систем имеет большее значение, чем для других (например, сотовые телефоны могут иметь очень ограниченную память)

2) Загрузка более крупной программы занимает больше времени

3) Во время выполнения вы, скорее всего, будете чаще пропускать кэш (вы пытаетесь перейти к той части программы, которой нет в кеше), потому что ваша программа распределена по большему количеству пространства. Это замедляет вашу программу.

3 голосов
/ 14 февраля 2011

Он будет загружаться и работать медленнее и может исчерпать виртуальное адресное пространство (в 100 раз больше ужасного).

2 голосов
/ 14 февраля 2011

Меньше вашей программы поместится в кэш-память ЦП, кэш-память диска и т. Д., И, следовательно, больше времени будет потрачено впустую, поскольку ЦП простаивает в ожидании появления этого кода.На самом деле все так просто.

Ах, я не смотрел, кто задал вопрос - острый зуб, эй?:-) - Вы, очевидно, ничего не узнали из ответа выше.Но и это все, что нужно - это просто статистический баланс, с настройками по умолчанию, без сомнения, сформированными авторами компилятора на основе давления со стороны клиента, чтобы объяснить как большие размеры исполняемых файлов, так и более медленные скорости выполнения по сравнению с другими поставщиками компиляторов.* Интересно, если датированные примечания лекций здесь: http://www.cs.utexas.edu/users/djimenez/utsa/cs3343/lecture15.html

1 голос
/ 14 февраля 2011

Это довольно сложная тема, и я думаю, вам стоит взглянуть на этот C ++ faq lite о inline

Это объясняет, что не существует простого решения, и есть много вещей, которые нужно рассмотреть (но все равно все сводится к хорошей интуиции!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...