我刚观看了Herb Sutter的演讲(见http://channel9.msdn.com/Events/Build/2014/2-661上的第46页)关于各种STL收容人表演的演讲。看起来std::vector
比std::list
更快,即使插入中间,看起来像是一个很大的NO-NO ......他的解释是,这是因为连续的内存分配std::vector
,因为线性横向似乎超快。我现在很好奇,有没有人在实际代码中观察到两者之间可见的性能差异?我不是一个专业的程序员,我只是在我的笔记本电脑上测试了一个简单的例子,似乎确实std::vector
插入的速度比std::list
快。这看起来有点奇怪......我想理解为什么矢量在STL实现中更快,
答案 0 :(得分:2)
由于您没有提供代码示例,我将提供一些可能的原因。
std::list
执行一次动态内存分配每插入,动态内存分配是一项昂贵的操作。 std::list
还需要花费O(n / 2)时间来查找中间元素,因为它必须遵循指针而不是仅仅添加一个指针。std::vector
会要求将列表末尾的所有元素向右移动,这可能与std::list
的遍历时间相似或更快。此外,std::vector
每当资源用完时,其大小往往会翻倍,因此与O(log n)
的{{1}}分配相比,它仅使用O(n)
次重新分配。如果您开始使用更大尺寸的每个容器进行测量,我认为您可能会了解有关复制成本与遍历成本的有趣信息。例如,2000万个元素。
此外,正如LightnessRacesinOrbit正确指出的那样,std::list
仅表示恒定时间,而O(1)
表示与输入大小成比例的时间,但这些时间界限不一定转化为实际测量的时间,尤其是对于小尺寸输入,因为O(n)
时间可能隐藏一个大常量。
但是,我认为对于这个特定的问题,列表遍历可能是罪魁祸首,因为它会导致O(1)
遍历时间以便插入到列表的中间。