Вопрос

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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's (один байт каждый) приведет к тому, что компилятор «нажимает» int вниз, чтобы его можно было получить в качестве полного слова (четыре байта). Вторая структура не требуется почти так много нажатия.

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

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

#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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top