迭代速度和元素大小

时间:2016-06-11 08:09:10

标签: c++ performance vector size

我有一个std::vector填充了以下结构:

#define ELEMENTSIZE 8

struct Element {
int value;
char size[ELEMENTSIZE - 4]; //1 char is 1B in size - 4B int
}; 

结构的大小取决于定义的元素大小,这会在结构中生成指定大小的字符数组。

我正在对矢量中这些结构的平均值进行基准测试,我很想知道填充大尺寸结构的矢量需要更长时间迭代的原因。

例如,具有1 000 000个8B结构的载体大约需要1,7ms,而相同的测试需要128B结构12,7ms。

这是因为只有缓存吗?如果是这样,你能解释一下原因吗?或者还有其他方面我看不到?

2 个答案:

答案 0 :(得分:0)

结构大16倍,因此迭代需要花费16倍的时间。数学上12,7 / 1,7 = 7,47倍,所以几乎在数学上匹配。

现在假设包含128B元素的结构是一个包含8B元素的结构,但大小相同。你现在看到它真的大16倍吗?

答案 1 :(得分:0)

操作系统必须将更大的结构带入内存,这可能需要这条路径:

  • 从虚拟内存到主内存(L4)
  • 从主存储器到L3,再到L2和L1,直到处理器(如果需要处理)
  • 在L1或处理器级别,必须在正在使用的iterator对象周围复制内容。它在很大程度上取决于缓存性能。
  • 现在在每次迭代中,它取决于您使用迭代器执行的操作。如果正在复制或显示内容,则需要执行更多时间的某些排序/压缩(如果需要,从CPU到L4)。

如果所有这一切都发生了,为什么128结构不会比8字节结构花费更多时间?