Что такое "накладные расходы"?


Я студент в области компьютерных наук, и я слышу слово "накладные расходы" много, когда дело доходит до программ и сортов. Что это значит?

11 106

11 ответов:

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

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

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

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

  • накладные расходы протокола: кадры Ethernet, IP-пакеты и сегменты TCP все имеют заголовки, TCP-соединения требуют пакетов рукопожатия. Таким образом, вы не можете использовать всю пропускную способность оборудования способный для ваших фактических данных. Вы можете уменьшить накладные расходы, используя большие размеры пакетов, а UDP имеет меньший заголовок и не рукопожатие.
  • накладные расходы на память структуры данных: связанный список требует, по крайней мере один указатель на каждый элемент содержит. Если элементы имеют тот же размер, что и указатель, это означает 50% накладных расходов памяти, тогда как массив потенциально может иметь 0% накладных расходов.
  • накладные расходы на вызов метода: хорошо продуманная программа сломалась вниз на множество коротких методов. Но каждый вызов метода требует настройки кадра стека, копирования параметров и обратного адреса. Это представляет собой нагрузку на процессор по сравнению с программой, которая делает все в одной монолитной функции. Конечно, добавленная ремонтопригодность делает его очень стоящим, но в некоторых случаях чрезмерные вызовы методов могут иметь значительное влияние на производительность.

Википедия нас прикрыли:

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

вы устали и не можете больше работать. Вы едите пищу. Энергия, потраченная на поиски пищи, ее получение и фактическое потребление, потребляет энергию и накладные расходы!

накладные расходы-это то, что тратится впустую для выполнения задачи. Цель состоит в том, чтобы сделать накладные очень маленькие.

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

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

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

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

давайте приведем конкретный пример: вычислить среднее (среднее арифметическое) из набора чисел.

очевидный подход состоит в том, чтобы перебирать входы, сохраняя текущий итог и количество. Когда встречается последнее число (сигнализируется "конец файла" EOF, или какое-то значение sentinel, или какая-то кнопка GUI, что угодно), мы просто делим общее количество на количество входов, и мы закончили.

этот подход не несет почти никаких накладных расходов с точки зрения процессора, памяти или других ресурсов. (Это тривиальная задача).

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

для сравнения этот подход может привести к произвольным объемам памяти накладных расходов.

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

еще один (возможно, более абсурдный) подход состоял бы в том, чтобы опубликовать все входные данные в некоторой таблице SQL в СУБД. Затем просто вызовите функцию SQL SUM в этом столбце этой таблицы. Это переносит наши накладные расходы на локальную память на какой-то другой сервер и вызывает сетевые накладные расходы и внешние зависимости от нашего исполнение. (Обратите внимание, что удаленный сервер может иметь или не иметь каких-либо конкретных накладных расходов памяти, связанных с этой задачей - - - он может сразу же отправить все значения в хранилище, например).

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

мы также можем говорить о накладных расходах, связанных с факторами, выходящими за рамки собственного кода программиста. Например, составление кода для 32 или 64 разрядных процессоров может повлечь за собой большую нагрузку, чем можно было увидеть на старой 8-разрядной или 16-разрядной архитектуры. Это может включать в себя большую нагрузку на память (проблемы выравнивания) или нагрузку на ЦП (где ЦП вынужден регулировать порядок битов или использовать не выровненные инструкции и т. д.) Или и то, и другое.

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

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

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

конкретный пример накладных расходов-это разница между" локальным "вызовом процедуры и" удаленным " вызовом процедуры.

например:

service.function(param1, param2);

это обычный метод или удаленный метод? От того, что вы видите здесь, вы не можете сказать.

но вы можете себе представить, что разница во времени выполнения между двумя вызовами драматична.

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

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

его ничего, кроме самих данных, т. е. флагов tcp, заголовков, crc, fcs и т. д..