【问题标题】:What makes STL fast? [closed]是什么让 STL 快速? [关闭]
【发布时间】:2010-02-12 17:19:27
【问题描述】:

如果以通常实现的方式实现数组类,则与向量等 STL 等效项相比,它的性能会更慢。那么是什么让 STL 容器/算法快速?

【问题讨论】:

  • “它的普遍实现方式”是一个非常模糊的东西。每个人都以自己的方式实现它。从技术上讲,它通常未实现但被重复使用。
  • 请说明您引用了哪些操作,以及您如何确定标准库更快。
  • @Mehrdad, Malte:是的,我同意。但是,假设对于一个数组类,通过将元素移回原处来在中间插入一个元素,从而为新元素创建一个空白空间。这个实现比向量的 push_back() 慢得多。我通过获取时间或时钟周期来确定它。
  • 您正在比较插入到数组与vector.push_back()?那不是插入,而是追加。
  • @Malte-Clasen:@UncleBens:没错。看来他是在比较苹果和橘子。

标签: c++ performance stl


【解决方案1】:

像for_each 这样的STL 算法采用可以轻松内联的函数对象。另一方面,C 使用编译器难以优化的函数指针。

这在某些算法(如排序)中产生了很大的不同,其中比较器函数必须被多次调用。

维基百科有some more information,以防你感兴趣。

编辑:

至于 STL 的向量类,我认为它不一定比你可以在 glibc 中找到的更快。

【讨论】:

  • 这可能是症结之一:D
【解决方案2】:

大多数人的数组类通过一个常数增量而不是一个常数因子来增加大小(正如标准库所要求的那样)。这意味着插入元素需要大致线性时间,而不是标准库的摊销常数时间。

【讨论】:

  • 任何这样做的开发者都应该归还他的计算机科学学位
  • @DrJokepu:您假设开发人员拥有计算机科学学位:) +1
【解决方案3】:

标准库使用了很好的算法,例如在数组 (std::vector) 的情况下,每次空间不足时它通常会加倍存储空间,而简单的实现可能每次都会将存储空间增加一个元素。因为增加存储量非常慢(所有现有数据都需要从旧分配复制到新分配),这会产生巨大的差异。

同样,所有其他算法都以相当优化的方式实现。标准库通常不会在源代码级别使用任何类型的循环展开或其他此类优化。然后编译器会优化它只是普通的简单代码(带有可怕的变量名和大量模板)。

我所说的不是 C++ 标准规定的,而是现有实现中的常见做法。

【讨论】:

  • 在达到 1 兆字节左右后,双倍存储实际上可能非常糟糕......
  • Hassan Syed:你永远不会浪费超过 50% 的分配内存。我不会称之为“非常糟糕”。
  • 显然 std::vector 增长了 1.5 倍:amitp.blogspot.com/…
  • @Manuel:它必须是一个常数因子。虽然 2 在大多数早期实现中都使用过,但 1.5(左右)现在更为常见。据我所知,Andrew Koenig 是第一个指出为什么要这样做的人:groups.google.com/group/comp.lang.c++.moderated/msg/…
  • @Jerry - 感谢您的链接,很高兴知道 1.5 被广泛使用的原因(我认为 Python 列表的增长方式相同)。但你似乎暗示我说这不是一个恒定的因素,是什么让你这么认为?
【解决方案4】:

各级数学家和计算机科学家多年来一直在研究 STL 中的算法,他们通常使用绝对最有效的算法,而您的实现可能并未使用这些算法。常见的实现可能不是最快的,但最容易理解; STL 可能正在使用更优化的实现。

【讨论】:

  • 当各种受过高等教育的人都祝福某件事(如果他们有的话),不要以为你不需要考虑它。他们很有能力也有资格犯错。
  • -1:我会说这根本不是一个真实的陈述。 “算法”是特定于实现的。仅指定了 STL 算法/容器等的公开行为。 STL 的实现有很多很多,但它们并没有被仔细检查(事实上,我想说大多数都没有)到接近你声称的水平。许多实现比一般的程序员写的要好,但是好的程序员可以轻松地与他们竞争......
【解决方案5】:

除了良好的通用算法(正如其他人所指出的)之外,由于大量使用模板,STL 也非常有效。

Template metaprograms 具有编译器积极优化它们的好特性。一些编译器对此非常擅长,并将模板减少为给定任务所需的最小、最有效的代码。一般来说,这意味着函数尽可能内联,与特定类型交互的代码被简化为最简单的形式。当然,大多数 STL(以及大多数 Boost)实现都充分利用了这一点。

【讨论】:

    【解决方案6】:

    代码以编译器友好的方式编写,例如内联等。

    当然,他们使用的算法是最先进的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-30
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      • 2023-03-31
      • 2018-04-12
      • 2011-08-13
      • 1970-01-01
      相关资源
      最近更新 更多