繁体   English   中英

std :: list vs std :: vector iteration

[英]std::list vs std::vector iteration

据说,迭代遍历向量(如在读取所有元素时)比迭代遍历列表更快,因为优化了缓存。

网上是否有任何资源可以量化它对表现的影响程度?

此外,使用自定义链接列表会更好吗,哪些元素将被预先分配,以便它们在内存中连续?

这背后的想法是我想以某种不会改变的顺序存储元素。 我仍然需要能够在运行时快速插入一些,但是大多数仍然是连续的,因为顺序不会改变。

元素是连续的这一事实是否会对缓存产生影响,或者因为我仍然会调用list_element->next而不是++list_element它不会改进任何东西?

向量和列表之间的主要区别在于向量元素随后在预分配缓冲区内构造,而在列表元素中逐个构造。 因此,向量中的元素被授予占用连续的内存空间,而列表元素(除非某些特定情况,如自定义分配器以这种方式工作)不被授予如此,并且可以在其周围“稀疏”。记忆。

现在,由于处理器在高速缓存上运行(可以比主RAM快1000倍),它重新映射主存储器的整个页面,如果元素是连续的,则很可能它们适合相同的存储器页面,因此迭代开始时,在缓存中一起移动。 在继续操作时,一切都在缓存中发生,无需进一步移动数据或进一步访问较慢的RAM。

使用list-s,由于元素在任何地方都是稀疏的,“转到下一个”意味着引用可能不在其先前的同一内存页面中的地址,因此,需要在每个迭代步骤更新缓存,访问每次迭代时RAM较慢。

性能差异在很大程度上取决于处理器以及主RAM和缓存使用的内存类型,以及std::allocator (最终是operator newmalloc )的实现方式,因此一般数字是不可能的给予。 (注意:差异很大意味着RAM缓存不好,但也可能意味着列表上的实现不好)

由于数据结构的紧凑表示而导致的高速缓存一致性的效率增益可能相当显着。 在向量与列表进行比较的情况下,紧凑表示不仅可以更好地用于读取,而且甚至可以用于某些特定体系结构的元素插入(向量移位)到500K元素的量级,如本文图3中Bjarne所示。斯特劳斯:

http://www2.research.att.com/~bs/Computer-Jan12.pdf

(出版社网站: http//www.computer.org/portal/web/csdl/doi/10.1109/MC.2011.353

我认为如果这是您的程序的关键因素,您应该在您的架构上进行分析。

不确定我是否可以解释它,但这是我的观点(我正在考虑下面的翻译机器指令:),

向量迭代器(连续内存):当您递增向量迭代器时,迭代器值只是添加对象的大小(在编译时已知)以指向下一个对象。 在大多数CPU中,这最多只能有一到三条指令。

列表迭代器(链接列表http://www.sgi.com/tech/stl/List.html ):当您递增列表迭代器(指向对象)时,通过向该列表添加一些数字来定位前向链接的位置。指向对象的base,然后将其作为迭代器的新值加载。 对此有多个内存访问,并且比向量迭代操作慢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM