Що таке "накладні витрати"?


149

Я студент комп’ютерних наук і дуже багато чую слово "накладні", коли мова йде про програми та інші види. Що це означає саме?


27
скільки «зайвих речей» потрібно зробити, щоб щось дістати. Наприклад, якщо мені доведеться завантажити проект 37 класу просто для того, щоб надрукувати "Hello World", я вважаю, що це великі накладні витрати.
сканліфф

1
@ doug65536 Насправді все навпаки. =)
Юкіо Фукузава

Відповіді:


177

Це ресурси, необхідні для налаштування операції. Це може здатися непов’язаним, але необхідним.

Це як коли потрібно кудись їхати, може знадобиться машина. Але, було б дуже багато накладних, щоб змусити машину їхати по вулиці, тож ви, можливо, захочете піти. Однак накладні витрати були б варті того, якби ви їхали по всій країні.

В інформатиці іноді ми використовуємо машини, щоб їхати по вулиці, тому що в нас немає кращого шляху, або "не варто витрачати наш час" навчитися ходити ".


84
Аналогічна аналогія була б і з літаючим. Літаки набагато швидше, ніж автомобілі, але накладні витрати на реєстрацію в аеропорту, безпека тощо робить автомобілі кращим варіантом для коротших відстаней.
FogleBird

s / drive / go / (Якщо вам потрібно їхати кудись, ви зазвичай не вирішили гуляти ...
RCIX

1
@ inf3rno Іронія? Як доїхати до нашого автомобіля? Ми ходимо. І ми можемо повністю піти ... до нашої машини. Ми не можемо піти до місця призначення, навіть якщо він ближче, ніж наш автомобіль.
corsiKa

Якби я сказав, що я пишу низький накладний код Java, як би ви трактували це з точки зору визначення поняття "ресурси, необхідні для налаштування операції". Мій код не потребує великих налаштувань?
відданий

Ну, ви повинні увімкнути комп’ютер або сервер, ви повинні завантажити операційну систему та всі драйвери, ви повинні запустити процес Java, ви повинні ввімкнути JVM, ви повинні завантажити всі свої класи, ви доведеться синхронізувати буфер вводу-виводу на консоль, щоб ви могли зробити свій "привіт світ". Але, будь ласка, розкажіть мені більше про низьке накладне кодування.
corsiKa

40

Значення цього слова може сильно відрізнятися залежно від контексту. Загалом, використовуються ресурси (найчастіше - пам'ять та час процесора), які не вносять безпосереднього внеску в запланований результат, але вимагаються технологією чи методом, який використовується. Приклади:

  • Накладні витрати протоколу : кадри Ethernet, IP-пакети та сегменти TCP мають заголовки, TCP-з'єднання вимагають пакетів рукостискання. Таким чином, ви не можете використовувати всю пропускну здатність, на яку апаратне забезпечення здатне реально використовувати дані. Ви можете зменшити накладні витрати, використовуючи більші розміри пакетів, а UDP має менший заголовок і відсутність рукостискань.
  • Накладні дані структури структури даних : зв'язаний список вимагає принаймні одного вказівника на кожен елемент, який він містить. Якщо елементи мають той же розмір, що і вказівник, це означає 50% накладних витрат на пам'ять, тоді як масив потенційно може мати 0% накладних витрат.
  • Накладні виклики методів : Добре розроблена програма розбита на безліч коротких методів. Але кожен виклик методу вимагає встановлення кадру стека, копіювання параметрів та зворотної адреси. Це являє собою накладні витрати процесора порівняно з програмою, яка виконує все в одній монолітній функції. Звичайно, додаткова ремонтопридатність робить її дуже вартим, але в деяких випадках надмірні виклики методів можуть мати значний вплив на продуктивність.

Звучить, що слово має однакове значення у всіх цих прикладах (необхідне для виконання завдання, але не завжди пов'язане з його прямим виконанням)
RCIX,

Повторне об'єм пам'яті структури даних: У більшості алокаторів пам'яті це навіть гірше. Кожне повернене значення mallocмає вбудований накладний обсяг у 8 байт завдяки аллокатору (припускаючи класичну 32-бітну машину), що складається з розміру блоку плюс захисних значень. І це перш, ніж ви навіть подумаєте про деталізацію розподілу. Одинично пов'язаний список простих 4-байтових цілих чисел буде мати 75%; масиви набагато кращі (якщо вам не потрібна швидка вставка посередині), оскільки вони можуть мати один раз накладні витрати (або менше, якщо масив не розподіляється динамічно).
стипендіати

19

Ви втомилися і не можете більше працювати. Ви їсте їжу. Енергія, витрачена на пошуки їжі, її отримання та фактично вживання в їжу, споживає енергію та є надмірною!

Накладні витрати - це щось марне для того, щоб виконати завдання. Мета - зробити накладні витрати дуже маленькими.

В інформатиці давайте скажемо, що ви хочете надрукувати номер, це ваше завдання. Але зберігання номера, налаштування дисплея для його друку та виклик процедур для його друку, а потім доступ до номера зі змінної - все накладні.


17

Вікіпедія охоплює :

В інформатиці, накладні витрати , як правило , вважається будь-яка комбінація надлишкового або непрямого часу обчислення, пам'яті, пропускної здатності та інших ресурсів, необхідних для досягнення певної мети. Це особливий випадок інженерних накладних витрат.


4
Але якби цього не було, ви виправите WikiPedia, а потім зробіть ту саму публікацію.
SamGoody

11

Накладні витрати, як правило, залежать від кількості додаткових ресурсів (пам'яті, процесора, часу тощо), які потребують різні алгоритми програмування.

Наприклад, накладні витрати на вставку врівноваженого бінарного дерева можуть бути набагато більшими, ніж та сама вставка у простий список пов'язаних (вставка займе більше часу, використовуйте більше процесорної потужності для врівноваження дерева, що призводить до більш тривалого сприйнятого часу роботи на користувач).


5

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

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

Наведемо конкретний приклад: Обчисліть середнє (середнє арифметичне) набору чисел.

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

Цей підхід майже не потребує накладних витрат з точки зору процесора, пам'яті чи інших ресурсів. (Це тривіальне завдання).

Іншим можливим підходом є "припущення" введення до списку. повторіть список, щоб обчислити суму, а потім розділіть його на кількість дійсних елементів зі списку.

Для порівняння, цей підхід може спричинити за собою довільну кількість пам'яті.

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

Ще одним (напевне, більш абсурдним) підходом було б розмістити всі входи до якоїсь таблиці SQL в RDBMS. Потім просто викликати функцію SQL SUM у цьому стовпчику цієї таблиці. Це зміщує нашу локальну пам’ять накладні на якийсь інший сервер, і виникає мережеві накладні та зовнішні залежності від нашого виконання. (Зверніть увагу, що віддалений сервер може мати або не мати якогось конкретного накладного режиму пам'яті, пов'язаного з цією задачею --- він може винести всі значення негайно на зберігання, наприклад).

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

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

Зауважте, що дисковий простір, зайнятий вашим кодом та його бібліотеками тощо, зазвичай не називається "накладними", а називається "слід". Також базову пам'ять, яку споживає ваша програма (без огляду на будь-який набір даних, який вона обробляє), називають також її "слід".


3

Накладні витрати - це просто більший витрата часу на виконання програми. Приклад; коли ми викликаємо функцію, і її управління передається там, де вона визначена, а потім виконується її тіло, це означає, що ми змушуємо наш процесор працювати довгим процесом (спочатку передаючи елемент управління в інше місце в пам'яті, а потім виконуємо там, а потім повернення управління назад до колишньої позиції), отже, це займає багато часу виконання, отже, накладні витрати. Наші цілі полягають у тому, щоб зменшити накладні витрати, використовуючи вбудований текст під час визначення функції та час виклику, який копіює вміст функції під час виклику функції, отже, ми не передаємо керування в інше місце, але продовжуємо нашу програму в рядку, отже, в рядку .


2

Ви можете використовувати словник. Визначення те саме. Але щоб заощадити ваш час, накладні витрати - це робота, необхідна для виконання продуктивної роботи. Наприклад, алгоритм працює і виконує корисну роботу, але для його роботи потрібна пам'ять. Цей розподіл пам’яті потребує часу і не пов'язаний безпосередньо з виконаною роботою, тому є накладними.


1

Ви можете перевірити Вікіпедію . Але в основному тоді, коли використовується більше дій чи ресурсів. Наприклад, якщо ви знайомі з .NET, ви можете мати типи значень та типи посилань. Референтні типи мають накладні витрати, оскільки їм потрібно більше пам'яті, ніж типи значень.


1

Конкретним прикладом накладних витрат є різниця між "локальним" викликом процедури та "віддаленим" викликом процедури.

Наприклад, з класичним RPC (та багатьма іншими віддаленими кадрами, як-от EJB) виклик функції або методу виглядає аналогічно кодеру, будь то локальний, у виклику пам'яті або розподілений мережевий дзвінок.

Наприклад:

service.function(param1, param2);

Це нормальний метод чи віддалений метод? З того, що ви бачите тут, ви не можете сказати.

Але ви можете уявити, що різниця у часі виконання між двома дзвінками є драматичною.

Отже, хоча реалізація основних процесів буде "коштувати однаково", "накладні витрати" є зовсім іншими.


1

Подумайте про накладні витрати як про час, необхідний для управління нитками та координації між ними. Це тягар, якщо нитка не має достатньо завдань для виконання. У такому випадку накладні витрати перевищують витрачений час за допомогою використання різьблення, і код займає більше часу, ніж послідовний.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.