什么是开销?是否有多种类型的开销,还是只有一种?有哪些例子?
4 回答
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,以便它可以作为一个完整的字(四个字节)访问。第二个结构几乎不需要太多的推动。
故事的寓意:将相似大小的数据成员放在一起。
于 2010-10-17T19:47:32.057 回答
3
开销是对特定资源的任何使用,这是您实际尝试实现的副作用。例如,结构填充是内存开销的一种形式。在堆栈上推送和弹出参数是一种处理开销。包头是带宽开销的一种形式。想想一个资源,它可能有与之相关的开销。
于 2010-10-17T19:35:27.697 回答
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
它要快得多,因为循环迭代更符合数组索引的顺序。因此,数据更有可能被连续访问,因此更有可能在缓存中可用。
于 2010-10-17T19:56:31.283 回答