Подтвердить что ты не робот

Что такое inlining?

Я имею в виду эту дискуссию. Я никогда не писал код на C или на С++. У меня нет фона CS. Однако я работаю разработчиком Java уже 5 лет, и теперь я решил узнать больше о CS и немного догнать.

4b9b3361

Ответ 1

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

Inlining решает проблему производительности и ремонтопригодности, позволяя объявить функцию как встроенную (по крайней мере, на С++), так что, когда вы вызываете эту функцию, вместо того, чтобы ваше приложение прыгало во время выполнения, код в встроенной функции вводится во время компиляции каждый раз, когда вызывается данная функция.

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

Ответ 2

http://en.wikipedia.org/wiki/Inlining

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

Ответ 3

Как разработчик Java, вам, как правило, не нужно беспокоиться о введении метода. Java. Компилятор Just-in-time может и будет делать это автоматически в большинстве мест, где это имеет смысл.

IDE, такие как eclipse, могут иметь функцию, которая позволяет встроить методы на уровне исходного кода - никогда не делайте этого для производительности, только для чтения кода (например, когда вы понимаете, что метод просто вызывает другой метод, не добавляя ничего полезного).

Ответ 4

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

Стоит отметить, что в ядре Linux они начали откатывать изначально встроенные функции некоторое время назад, потому что стоимость была слишком высокой (большие функции потребляли больше кэша памяти процессора, а результирующие промахи в кеше были более дорогими, чем просто вызывая функцию, которая должна была быть встроена). Подробнее см. "Глава 15: Инлайн-болезнь" в doc/Documentation/CodingStyle.

Ответ 5

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

Это будет более подробно: http://www.codersource.net/cpp_tutorial_inline_functions.html

Ответ 6

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

Ответ 7

Ответы оптимизатора компилятора верны. Существует еще одно использование, однако - в refactoring вставка означает замену вызова метода телом метода, а затем удаление метода, См. Встроенный метод. Существуют аналогичные рефакторинги, такие как Inline Class.

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

Ответ 8

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

Ответ 9

Норман Маурер объясняет в своем блоге JVM и JIT встроенные функции, подобные этому

Inlining - это метод, который будет в основном просто "встроить" один метод в другой и избавиться от вызова метода. JIT автоматически обнаруживает "горячие" методы и пытается встроить их для вас. Метод считается "горячим", если он был выполнен больше X раз, где X является порогом, который может быть настроен с использованием флага JVM при запуске java (по умолчанию 10000). Это необходимо, поскольку вложение всех методов принесет больше вреда, чем что-либо еще, из-за огромного созданного байтового кода. Кроме того, JIT может "вернуть" предыдущий встроенный код, когда оптимизация окажется неправильной в более позднем состоянии. Помните, что JIT означает Just in Time и поэтому оптимизирует (включая встраивание, но также и другие вещи) во время выполнения кода.

Также с предупреждением

Но даже если JVM считает, что метод "горячий", он не может его встроить. Но почему? Одна из наиболее вероятных причин - просто увеличить размер.

И вы можете найти очень простой пример кода для наложения кода Java на Eva Andreasson Java World Post. Вы можете найти соответствующую часть сообщения ниже.

Многие оптимизации пытаются исключить инструкции перехода на машинный уровень (например, JMP для архитектуры x86). Команда перехода изменяет регистр указателя команд и тем самым передает поток выполнения. Это дорогостоящая операция по сравнению с другими инструкциями ASSEMBLY, поэтому она является общей целью сокращения или устранения. Очень полезная и известная оптимизация, нацеленная на это, называется inlining. Поскольку прыжки являются дорогостоящими, может оказаться полезным встроить в часовые вызовы небольшие методы с разными адресами ввода в вызывающую функцию. Код Java в листингах с 3 по 5 иллюстрирует преимущества встраивания.

Листинг 3. Метод вызова

int whenToEvaluateZing(int y) {
   return daysLeft(y) + daysLeft(0) + daysLeft(y+1);
}

Листинг 4. Вызываемый метод

int daysLeft(int x){
   if (x == 0)
      return 0;
   else
      return x - 1;
}

Листинг 5. Встроенный метод

int whenToEvaluateZing(int y){
   int temp = 0;

   if(y == 0) temp += 0; else temp += y - 1;
   if(0 == 0) temp += 0; else temp += 0 - 1;
   if(y+1 == 0) temp += 0; else temp += (y + 1) - 1;

   return temp; 
}

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

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

Листинг 6. После встраивания можно применить больше оптимизаций

int whenToEvaluateZing(int y){
   if(y == 0) return y;
   else if (y == -1) return y - 1;
   else return y + y - 1;
}

Ответ 10

В этом обсуждении Jon Skeet упоминает Client jvm (hotspot) v Server jvm с улучшениями производительности, доступными во время выполнения, если компилятору JIT (точно в срок) разрешено использовать временные улучшения. Это "как это делается" на Java.

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

Сегодня Singleton является предметом многостраничных обсуждений и циклического разворота, а также что-то вроде inlining несколько удалены из их исходного контекста. Вы можете прочитать Дову Бульке очень информированную работу по этому вопросу, чтобы получить C/С++. Для Java изучение этого богатого lib в java.util лучше удовлетворит ваши потребности, а не изучение проблем вложения и глубоких компиляторов - вы можете повесить на укоренившиеся вскрытые внутримышечные войны в структурах данных, которые затушевывают вызовы в 16-битный код и не заканчивайте свою кривую обучения.

Вы можете сделать instanceof в Java, который похож на vf-таблицу (без тепла, пожалуйста), но подумайте об этом, поскольку вы пишете на строго типизированном языке, и теперь будете писать на языке, где строка может убежать легко ковыряться там, где у него нет дела. Недавно я попытался написать код, который создал изображение на Java, делая это из кода C. Вскоре я обнаружил, что смотрю на стол oxr для сильного шифрования - это не имеет никакого отношения к коду, который я писал.

Как бы вы написали строковый класс в C/С++, который имеет небольшой буфер для строк ниже 32 байт и указателей ловушек, чтобы они работали только с строкой?

Не пытайтесь дразнить вас или что-то еще, это просто отличное место для начала, а не для инкрустации и науки компилятора.