c++ - 标准 vector 性能/替代

标签 c++ performance vector

我必须临时处理和存储数据。目前我使用std::vector::push_back添加数据和std::vector::erase在达到最大元素时删除元素。我的问题是我必须处理大量数据,当达到最大数量时,删除似乎会影响性能。所以我决定每 y 毫秒添加数据并删除 x 个元素,作为优化。首先,我还在 vector 中保留了一定数量。我使用 vector 是因为我需要 const double *std::vector<T>::data()函数将数据传递到其他地方,我无法进行任何转换/复制或任何操作。它必须要快。

std::vector<double> data;
size_t max; // there are millions of elements, e.g. 2000000
data.reserve(max);

// happens every x microseconds
void receive(double val) {
    data.push_back(val);
}

// timed every x ms
void update() {
    if (data.size() > max)
        data.erase(data.begin(),data.end()+(data.size()-max));
}

我的问题是:如何提高效率?通过使用另一个容器?那么是否仍然可以将容器转换为 const double *

我刚刚意识到我总是超过这个设置的最大值,这可能是性能下降的原因吗?下面的代码能解决这个问题吗?

if (data.size() > max*0.8)
        data.erase(data.begin(),data.begin()+(data.size()-max*0.8));

提前致谢!

最佳答案

正如我在评论中所说,您的要求确实让您陷入困境。据我所知,唯一可以为您提供连续数据的容器是 std::vector

std::vector 有两个浪费时间的地方。第一种情况是当您尝试 push_back 已经达到其保留容量的 vector 时;必须分配一个新缓冲区,并将旧缓冲区内容复制到新缓冲区。您可以通过在达到容量之前删除元素来轻松避免这种情况。第二种是从 vector 末尾以外的任何地方删除;这需要将元素从它们在缓冲区中的旧位置复制到它们的新位置。 这部分是不可避免的。您唯一的选择是尽可能少地执行此操作,一次删除尽可能多的元素。

这是一个给你两个条件的模组:

void receive(double val) {
    static const size_t drop_size = max / 2;
    if (data.size() == data.capacity()) {
        data.erase(data.begin(), data.begin() + drop_size);
    }
    data.push_back(val);
}

每当缓冲区变满时,这将丢弃一部分数据。我随意选择了 max/2,但您可以调整该阈值以满足您的实际要求。

一个好的编译器会在 erase 期间优化元素的复制,但您也有可能使用 memcpy 做得更好。在这种情况下,您可以将 erase 替换为以下内容:

memcpy(&(data[0]), &(data[drop_size]), sizeof(double) * (data.size() - drop_size));
data.resize(data.size() - drop_size);

在决定使用它之前,您绝对应该对其进行基准测试。 我不知道有任何 vector 实现会在您调整 vector 大小时减少 vector 的容量,但我认为这不是标准的要求。 编辑:该标准包括一个要求,即当您调整大小低于当前容量时,迭代器不会失效,这保证了容量不会减少。

关于c++ - 标准 vector 性能/替代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40475311/

相关文章:

c - #define 在 C 中的效率

C++ std::vector 删除 MyClass 对象

c++ - 将事件传播到 QGraphicsView 和 QGraphicsScene

c++ - 分配给 `delete[]` 的 `int*` 上的 `new` 给出 malloc 错误

c++ - 将寄存器设计成可由 C 和 C++ 访问的外围设备的最佳实践?

python - 高效交换numpy数组中的元素

performance - Ember 数据 : pushing many records to store is slow

c++ - 如何使用 make 链接 c++ 中不同目录中的对象而不在 makefile 中引用它们?

c++ - 打印整数指针 vector 的值

c++ - C++11 是否允许 vector<const T>?