Pull to refresh

Comments 14

спасибо, очень интересно, получается надо просто перед -O3 дописать -g0 минимально, я так сделал у себя на тесте, ну это всё таки работает не как -always-inline без флагов и оптимизаций, вот например ручной интринсик и -O3 заметно глазом, я в своё время замечал даже эту разницу, на перемножении матриц, ставим камеру на кватернион с ним быстрее отклик, и далее передвижение и каждый поворот будет ссылаться на мультипликацию, и если убрать интринсик с перемножения там порядки скорости прям глазом заметны тоесть (наивная скорость vs интринсик оба в -O3) с интринсиком можно на процессоре поидее сделать вместо 3 подготовительных(TRS) -> =5(PV)=1 матрица и 1 для линка модели с визуализацией(с интринсиком там будет ну вроде малое количество инструкций с интринсиком вроде успеваем в интервал до отсылки 1 матрицы в шейдер) небольшая оптимизация-микро(ну это моё предположение покачто)

Отчасти дело в том, что встраивание — вообще одно из самых важных преобразований, поэтому за последние пару лет многие попытки обойтись без него оказались успешными

Раз 5 прочитал - ну нет в этом смысла. Смотрю оригинал:

Part of the reason is that, as inlining is one of the most important transformations, people have tried to create different profitability analyses the last couple of years

Другое дело.

Значит, надо читать статью в оригинале, а не в этой странной "перепевке".

Отчасти дело в том, что поскольку встраивание — одно из самых важных преобразований, за последние пару лет многие пытались проводить различные исследования его полезности.

Мои эксперименты со встраиванием в LLVM показывают, что он встраивает все функции, которые не являются доступными извне и вызываются только из одного места. Это в принципе логично - существовать для функции отдельно не имеет смысла, если известно, что она только в одном месте зовётся.

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

но нельзя встроить рекурсивную функцию Фибоначчи

Хоть автор и защитил в Греции диссертацию (на самом деле бакалаврскую работу, т.е. курсовик по-нашему) по оптимизирующим преобразованиям, но это его утверждение неверно. Встраивание здесь может быть достигнуто CPS-преобразованием.

Строгого универсального определения хвостовой рекурсии нет, поэтому можно было бы оставить этот вопрос на совести автора, у него тут ряд залепух и посерьёзнее.

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

Другое дело, что само это обстоятельство с нормальным порядком вызова автор не упоминает, и может быть даже и не подозревает о нём.

Нужно помочь компилятору и писать сразу заинлайненый код с минимумом функций! ;)

Ну вы бы хоть график построили. Вот вам массив циферок, удачного парсинга. Я же не компьютер.

forceinline полезен, если вы хотите в дальнейшем защитить код от анализа и модификации с помощью vmprotect, starforce, themida и так далее. Но если инлайнить всё подряд, чтобы "верхние" методы получались порядка мегабайта по размеру, то появляется реальный шанс поймать баг компилятора. Наверное потому, что такие крайности не тестируются. А разобраться, что происходит, оказывается не просто из-за размера получившегося метода. Дважды сталкивался с ошибками компиляции в msvc, оба раза причиной были многоуровневая вложенность и шаблоны.

если инлайнить слишком много, то начиная с некоторого размера и сложности получаемого кода компилятор перестаёт что либо оптимизировать

Sign up to leave a comment.

Articles