std :: vector-like类优化以容纳少量项目

时间:2012-02-21 14:24:41

标签: c++ optimization stl micro-optimization

在程序的一个时间关键部分,有一个类的成员看起来像这样: std :: vector m_vLinks; 在分析期间,我注意到大约99.98%的执行此向量仅包含0或1个项目。 然而,在极少数情况下它可能会持有更多。 根据探查器,这个向量肯定是一个瓶颈,所以我正在考虑进行优化:

  1. 使用类似矢量的界面制作手工制作的类
  2. 此类将包含真实大小,一个项目和指向向量的可选指针
  3. 在这种情况下,当vector包含1个项目时,将不会有任何动态内存分配,并且由于删除了一个间接,访问此项目也会更快(一点点)。
  4. 当我们需要持有更多数据时,动态分配矢量
  5. 当然这个向量不会提供一个包含所有项目的内存块(这里不需要),而且一些操作也会更复杂
  6. 在开始对这个东西进行原型设计以确定它是否有用之前,我想知道是否有人在某些第三方库中遇到了具有类似功能的自定义容器?

    我已经考虑过boost :: array,但是不想要它强加的大小限制

4 个答案:

答案 0 :(得分:8)

LLVM有一个名为SmallVector的类。

答案 1 :(得分:7)

在代码的非时间关键部分,执行:m_vLinks.reserve(1);。这样,在时间关键部分,通常没有动态分配。

答案 2 :(得分:5)

我的第一次尝试是优化内存分配器。天真的malloc实施效率不高,您可能需要尝试tcmallocjemalloc

我的第二次尝试是更改分配器。 Howard Hinnant演示了如何使用在堆栈上预先分配了一些内存的有状态分配器。这只是C ++ 11中的标准兼容,但可能已经支持。

我的第三次尝试是更改代码并尽可能预先分配内存。不是每次都重新构建vector,而是可以保留它:它的容量不会减少,因此后续使用不会分配内存。

自制程序实现与std::vector<T>类的速度相匹配的可能性很小,因为许多方法已经过调整以获得最佳性能。

答案 3 :(得分:0)

我通常会在这些情况下使用std::list。当N == 1时,std::list中的O(N)操作不会伤害我。