替换向量push_back以获得更好的性能

时间:2014-06-05 20:10:12

标签: c++ visual-studio-2010 buffer

我在visual studio中有一个c ++代码,它从一台机器上获取数据并实时进行一些图形渲染(使用opengl)。我在代码中进行了一些修改,将所有来自机器的数据存储到一个内存缓冲区(浮点数的向量),除了图形渲染,直到机器运行的时间,并在机器停止运行时将缓冲区的内容复制到文本文件。我使用push_back命令填充向量和实际时间渲染已经开始显示几秒钟的延迟。我知道这个滞后来自矢量push_back所遇到的性能。我正在寻找一个可能的替代品(使用和数组或使用分页内存)来渲染再次实时。我使用数组的麻烦是,在机器运行之前无法定义数组的大小。机器运行的时间没有预先确定。我想将整个数据保存在内存缓冲区中直到机器结束操作。任何人都有任何建议去除性能损失。

1 个答案:

答案 0 :(得分:1)

从最简单到最艰难,巧合的是从最大的影响到最小的影响。

预分配矢量

使用矢量最慢的部分之一是"复制"当你超过数组的最大大小。如果您知道向量的大小,那么加速向阵列添加元素的最佳方法是预分配。

有两种方法可以做到这一点。第一种是使用vector::resize,它将扩展数组并将所有值初始化为默认值(通常,读取)。如果要创建默认值的完整数组(如0),这可能会很棒。但是,如果您不想设置默认值(初始化为默认值可能很昂贵,或者默认对象可能是错误状态),则应使用vector::reservevector::reserve为所有新元素分配空间。根据我的经验,vector :: reserve对于类更好,vector :: resize对于POD更好。

在C ++ 11中,移动而不是复制

如果您有POD的东西,那么这不会对您有所帮助。但是,如果你说,向量的向量,而不是移动可以比复制更有效。 vector.push_back(std::move(x))会窃取x中的资源。如果你的类没有默认的移动构造函数,那么在将它放入向量之前先写一个。

制作自己的分配器

您可以创建自己的http://en.cppreference.com/w/cpp/memory/allocator,但不会在调整大小时进行初始化。当然,这通常没有帮助。