什么是开销?有多种开销,还是只有一种?有什么例子?

有帮助吗?

解决方案

业务含义 高架 成本最好解释。来自Wikipedia:

该术语间接费用通常用于分组企业继续运行所必需的费用,但不能立即与所提供的产品/服务联系起来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(每个字节)会导致编译器“按” 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