std::向量类,优化为容纳少量项
std::vector-like class optimized to hold a small number of items
在程序的一个时间关键部分中,类的一个成员如下所示:std::vector m_vLinks;在分析过程中,我注意到大约99.98%的执行中,这个向量只包含0或1个项目。然而,在极少数情况下,它可能会容纳更多。根据profiler的说法,这个向量肯定是一个瓶颈,所以我正在考虑以下优化:
- 手工制作一个具有类似矢量界面的类
- 这个类将包含真正的大小、一个项和指向向量的可选指针
- 在这种情况下,当向量包含1个项时,将不会有任何动态内存分配,而且由于删除了一个间接项,访问该项的速度也会更快
- 当我们需要持有更多的数据时,向量是动态分配的
- 当然,这个向量不会提供一个包含所有项目的内存块(这里不需要),而且有些操作会更复杂
在开始原型化这个东西之前,我想知道是否有人在一些第三方库中遇到过具有类似功能的自定义容器?
我已经考虑过boost::array,但不希望它强加的大小限制
在代码的非时间关键部分中,执行:m_vLinks.reserve(1);
。这样,在时间关键的部分,通常不会有动态分配。
我的第一次尝试是优化内存分配器。简单的malloc
实现并不太高效,您可能需要尝试tcmalloc
或jemalloc
。
我的第二次尝试是更改分配器。HowardHinnant已经演示了如何使用在堆栈上预先分配了一些内存的有状态分配器。这在C++11中仅符合标准,但可能已经得到支持。
如果可能的话,我的第三次尝试是更改代码并预先分配内存。与其每次都重新构建vector
,不如保留它:它的容量不会减少,因此后续使用不会分配内存。
自制实现与std::vector<T>
类的速度相匹配的可能性很小,因为它的许多方法都经过了优化,以获得最大的性能。
对于这些情况,我通常使用std::list
。当N==1时,std::list
中的O(N)运算不会伤害我。
相关文章:
- C++数组与向量排序(在我的情况下,向量比数组慢~2.5倍(无优化))
- 优化 c++ 数组和向量
- c++优化地返回结构和向量
- 优化将标准::uint32_t插入到标准::向量<char>中
- 如何在C++中找到两个向量之间的最小(优化)距离
- 将矩阵的行乘以向量(低级优化)
- 具有单位向量约束的非线性优化
- 如何优化C++逐行读取文件到向量中
- 如何优化这个处理大型 c++ 向量的函数
- 返回值优化与大向量的auto_ptr
- 优化向量赋值 c++
- 为指针向量优化对new的调用
- std::向量类,优化为容纳少量项
- c++,类,向量,优化:多个独立向量vs一个类向量
- 优化可变与不可变向量数学
- 优化检查一个比特向量是否是另一个的适当子集
- 如何在c++中优化检查向量中的元素
- 循环两个不同长度的向量时的优化
- 对象向量的优化向量似乎很慢
- 对向量的c++ operator()优化