C++ 迭代速度和元素大小

C++ 迭代速度和元素大小,c++,performance,vector,size,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 }; 结构的大小取决于定义的elementsize,它在结构中生成指定大小的字符数组 我正在对向量中这些结构的平均值进行基准测试,我很想知道为什么向量中填充的结构越大,迭代时间越长 例如,1000 000 8B结构的向量大约需

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

#define ELEMENTSIZE 8

struct Element {
int value;
char size[ELEMENTSIZE - 4]; //1 char is 1B in size - 4B int
}; 
结构的大小取决于定义的elementsize,它在结构中生成指定大小的字符数组

我正在对向量中这些结构的平均值进行基准测试,我很想知道为什么向量中填充的结构越大,迭代时间越长

例如,1000 000 8B结构的向量大约需要1,7ms,而128B结构的相同测试需要12,7ms


这是因为只有缓存造成的巨大差异吗?如果是,你能解释一下原因吗?还是有其他我看不到的方面

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


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

这个结构是16倍大,所以它需要16倍长的时间来迭代。数学上12,7/1,7=7,47倍,所以它在数学上几乎匹配


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

操作系统必须在内存中引入更大的结构,这可能会采取以下路径:

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

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

操作系统必须将较大的结构放在内存中,这可能会采取以下路径:

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

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

嗯,这听起来很合乎逻辑。但如果我看得更深一点,向量是内存中的连续存储。所以我假设,当我在向量上循环时,处理器应该在缓存中已经有了下一个迭代。我有一个64倍的处理器和ofc,更大的结构需要处理更多的操作(比方说3倍多的操作),但为什么延迟那么大?我遗漏了什么?在硬件级别,将移动更多数据。你不能说4字节和4MB的复制需要相同的时间。好吧,这听起来合乎逻辑。但如果我看得更深一点,向量是内存中的连续存储。所以我假设,当我在向量上循环时,处理器应该在缓存中已经有了下一个迭代。我有一个64倍的处理器和ofc,更大的结构需要处理更多的操作(比方说3倍多的操作),但为什么延迟那么大?我遗漏了什么?在硬件级别,将移动更多数据。不能说4字节和4MB的复制将花费相同的时间。