什么是“开销”?

时间:2010-10-17 19:32:52

标签: overhead

什么是开销?有多种类型的开销,或只有一种?有什么例子?

4 个答案:

答案 0 :(得分:4)

overhead费用的商业含义最能说明问题。来自维基百科:

  

术语开销通常用于   必要的团体费用   继续运作   生意,但不能马上   与产品/服务相关联   被提供1(例如,不要直接提供)   产生利润)。

开销是您需要执行操作的“成本”;你需要“投入”一些资源来执行有问题的操作。

答案 1 :(得分:3)

开销是对特定资源的任何使用,这是您实际尝试实现的副作用。例如结构填充是一种内存开销。在堆栈上推送和弹出参数是一种处理开销。数据包标头是带宽开销的一种形式。想想资源,它可能会产生与之相关的开销。

答案 2 :(得分: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,以便可以作为一个完整的字(四个字节)访问它。第二个结构不需要几乎同样的推动。

故事的道德:将相似大小的数据成员放在一起。

答案 3 :(得分: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

它更快,因为循环迭代更符合数组索引的顺序。因此,数据更有可能被连续访问,因此更有可能在缓存中可用。