我在visual studio中有一个c ++代码,它从一台机器上获取数据并实时进行一些图形渲染(使用opengl)。我在代码中进行了一些修改,将所有来自机器的数据存储到一个内存缓冲区(浮点数的向量),除了图形渲染,直到机器运行的时间,并在机器停止运行时将缓冲区的内容复制到文本文件。我使用push_back命令填充向量和实际时间渲染已经开始显示几秒钟的延迟。我知道这个滞后来自矢量push_back所遇到的性能。我正在寻找一个可能的替代品(使用和数组或使用分页内存)来渲染再次实时。我使用数组的麻烦是,在机器运行之前无法定义数组的大小。机器运行的时间没有预先确定。我想将整个数据保存在内存缓冲区中直到机器结束操作。任何人都有任何建议去除性能损失。
答案 0 :(得分:1)
从最简单到最艰难,巧合的是从最大的影响到最小的影响。
使用矢量最慢的部分之一是"复制"当你超过数组的最大大小。如果您知道向量的大小,那么加速向阵列添加元素的最佳方法是预分配。
有两种方法可以做到这一点。第一种是使用vector::resize
,它将扩展数组并将所有值初始化为默认值(通常,读取)。如果要创建默认值的完整数组(如0),这可能会很棒。但是,如果您不想设置默认值(初始化为默认值可能很昂贵,或者默认对象可能是错误状态),则应使用vector::reserve
。 vector::reserve
为所有新元素分配空间。根据我的经验,vector :: reserve对于类更好,vector :: resize对于POD更好。
如果您有POD的东西,那么这不会对您有所帮助。但是,如果你说,向量的向量,而不是移动可以比复制更有效。 vector.push_back(std::move(x))
会窃取x中的资源。如果你的类没有默认的移动构造函数,那么在将它放入向量之前先写一个。
您可以创建自己的http://en.cppreference.com/w/cpp/memory/allocator,但不会在调整大小时进行初始化。当然,这通常没有帮助。