【问题标题】:How fast is memory access to a vector compared to a normal array?与普通数组相比,对向量的内存访问速度有多快?
【发布时间】:2014-06-08 22:40:11
【问题描述】:

我有一个每秒调用数千次的函数(它是一种音频效果),我需要一个用于写入和读取音频数据的缓冲区。将浮点数组声明为普通数组还是向量,在性能上是否存在相当大的差异?

一旦声明,我的数组在音频循环期间不会调整大小,但在初始化阶段我不知道确切的长度,因为它取决于音频采样率。因此,例如,如果我需要一个 2 秒的音频缓冲区来实现 44100 Hz 的采样率,我通常会这样做:

declaration:
  int size;  
  float *buffer;

void init (int sr)
{
  size = sr * 2;
  buffer = new float[size]();
}

~destroy()
{
  delete [] buffer;
}

【问题讨论】:

  • 为什么不介绍这两种方法?
  • measure,发布版本

标签: c++ arrays audio optimization vector


【解决方案1】:

动态分配内存的成本很小,后面的释放也是如此,但您已经说明了new 的使用,因此您的成本相当于具有足够初始大小的vectorreserve 在各个方面的调用.

一旦分配,操作在任何优化的构建中都可以预期的一样快,但如果您有任何理由关心,您应该对自己进行分析。

这与您的 new-ing 代码无关,但仅供参考,由于寻址至少存在潜在差异 - 全局或静态数组可能在编译时具有已知的虚拟地址,而基于堆栈的数组可能位于与堆栈指针的已知偏移量,但在大多数架构上,这些和相对于运行时确定的指针的索引之间没有明显的性能差异。

【讨论】:

  • 注意 - 使用迭代器访问向量可能比使用浮点指针访问向量要慢。您可以将指针分配给 float 到向量的第一个成员 (&vector[0]) 的地址。
  • 迭代器应该只有在编译器没有很好地优化代码时才会变慢。使用 -O2 它应该转换为等效于指针访问。
  • vector 迭代器通常作为指针实现,因此问题在于您是通过相对于原始指针/迭代器的索引来访问更多元素,还是在数据中递增指针。这就像for (ptr = &v[0]; ptr != &v[size]; ++ptr) ...*ptr... for (size_t i = 0; i < size; ++i) ...ptr[i]...。通常迭代器以前一种风格使用,尽管您可以随机索引 vector::iterator ala v.begin()[42]。再次,如果您真的必须关心这两种方法。
猜你喜欢
  • 1970-01-01
  • 2014-01-11
  • 2016-12-25
  • 2011-04-26
  • 1970-01-01
  • 2017-03-20
  • 2021-03-11
  • 2011-04-01
  • 1970-01-01
相关资源
最近更新 更多