2010-10-17 2 views
3

Что такое накладные расходы? Есть ли несколько накладных расходов или только один? Какие примеры?Что такое «накладные расходы»?

+3

Google Определение Накладные: http://www.google.com/search?hl=en&safe=off&defl=en&q=define:overhead&sa=X&ei=x1C7TOyFOIP-8Ab18pmHDw&ved=0CBIQkAE –

ответ

4

Деловое значение overhead Стоимость объясняет это лучше всего. Материал из Википедии:

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

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

3

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

+2

я бы не сказал «нежелательными», но больше как "побочный эффект". – tenfour

+0

@tenfour: Да, это намного лучше. Я работал над этим в ответ. –

3

Вот пример размера накладных расходов для классов и структур:

struct first { 
    char letter1; 
    int number; 
    char letter2; 
}; 

struct second { 
    int number; 
    char letter1; 
    char letter2; 
}; 

int main() 
{ 
    cout << "Size of first: " << sizeof(first) << endl; 
    cout << "Size of second: " << sizeof(second) << endl; 
    return 0; 
} 

Результат:

Size of first: 12 
Size of second: 8 

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

Мораль истории: разместить аналогичные элементы данных рядом друг с другом.

1

Вот пример времени накладных расходов, связанных с более эффективного использования местности для использования кэша:

#include <stdio.h> 

#define SIZE 1024 

double A[SIZE][SIZE], B[SIZE][SIZE], C[SIZE][SIZE]; 

int main() 
{ 
    int i, j, k; 

    for (i = 0; i < SIZE; i++) { 
     for (j = 0; j < SIZE; j++) { 
      for (k = 0; k < SIZE; k++) { 
       C[i][j] += A[i][k] * B[k][j]; 
      } 
     } 
    } 

    return 0; 
} 

Запуск этого на моей машине занимает столько времени:

real 0m35.137s 
user 0m34.996s 
sys  0m0.067s 

Теперь я буду поменять местами J и K итераций цикла:

#include <stdio.h> 

#define SIZE 1024 

double A[SIZE][SIZE], B[SIZE][SIZE], C[SIZE][SIZE]; 

int main() 
{ 
    int i, j, k; 

    for (i = 0; i < SIZE; i++) { 
     for (k = 0; k < SIZE; k++) {   // this is the only change 
      for (j = 0; j < SIZE; j++) { 
       C[i][j] += A[i][k] * B[k][j]; 
      } 
     } 
    } 

    return 0; 
} 

среда выполнения для этого является:

real 0m5.489s 
user 0m5.436s 
sys  0m0.040s 

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

Смежные вопросы