在哪里可以找到不同STL容器复杂性(性能)的比较?

时间:2009-06-26 13:10:39

标签: c++ performance stl complexity-theory

我搜索了很长一段时间才找到一个比较,显示插入/推送擦除/弹出等所有STL-Containers的复杂性差异。我没有找到任何。我的所有STL书籍也没有。任何提示?

我当然知道一些经验法则。但是定义在哪里?

3 个答案:

答案 0 :(得分:2)

尝试

http://www.sgi.com/tech/stl/complexity.html

http://www.sgi.com/tech/stl/table_of_contents.html

来自complexity.html:

  

从根本上说,很难   定义渐近的概念   算法复杂度正是为了   真正的计算机硬件而不是   抽象机器模型。因此我们解决了   遵循以下准则:

     
      
  1. 对于具有运行时间O(f(n))的算法A,必须有一个   相应的算法A'即   在任意机器上纠正   long指针和size_t类型等   A和A'基本上执行   相同的操作顺序   实际的硬件。 (在简单的情况下A.   和A'将是一样的。其他   案例A可能已经简化了   地址的知识是   有限的。输入   大号n,A'最多必须占用   时间Cf(n),其中C是常数,   独立于n和地址   尺寸。 (指针,size_t和ptrdiff_t   假定操作采取   恒定的时间独立于他们的   大小。)
  2.   
  3. 所有容器或迭代器复杂性规范参考   摊销的复杂性。个人   操作可能需要更长时间   指定。但任何足够长的   相同的操作顺序   容器或迭代器将采取   最多只要相应的总和   指定的运营成本。
  4.   
  5. 算法指定最坏情况或平均情况   表现,并确定哪些。   除非另有说明,否则平均值   假设容器元素是   从有限类型中选择更多   可能的值大于   容器和容器元素   是独立的   分布。
  6.   
  7. 操作f的复杂性规范假定操作   由f调用最多需要   指定的运行时但算法   如果通常保持适当   调用的操作不过是一个   对数因子慢于   在预期的情况下指定。
  8.   
  9. 如果操作比假定的功能F更昂贵   当前的STL,然后F将减速到   大多数与增加的成本成比例。   未来的任何操作都会失败   满足这个属性将成为   明确的。

         

    为了使其精确,假设F指定使用时间f(m)   输入大小m。 F使用操作Gk,   指定的运行时间gk(n)on   输入大小如果在a中使用F.   每个Gk较慢的上下文   超过预期的最多因素   h(n),然后F最多减速a   系数h(m)。这是因为没有   目前的算法适用   操作Gk到输入   显着大于m。

  10.   

答案 1 :(得分:1)

ISO C ++标准定义了算法和容器访问方法的复杂性(如果需要)。所有其他地方(如果没有明确说明)所有投注都是关闭的,图书馆实施者可以自由地进行实施。

例如,您可以假设使用红黑树实现了地图和集合,但没有要求这样做。许多算法都过载或专用于特定的迭代器类别(如随机访问迭代器),有时可能甚至优化以从特殊硬件(如XMM寄存器和并行执行某些操作)执行。

有时你真的必须逻辑地假设操作可能花费多少,由于其他要求,例如std :: list中的splice必须具有O(1)复杂度=>长度为O(n)。

我收到了N. Josuttis的书 C++ Standard Library - Tutorial And Reference 所有这些方面都很好地涵盖在那里。

最诚挚的问候,
Ovanes

答案 2 :(得分:1)

看一下有关STL,Boost和数组容器性能的报告

http://landenlabs.com/code/perf-stl/perf-stl.html