【问题标题】:Vector vs Deque Insertion Time向量与双端队列插入时间
【发布时间】:2014-02-04 01:34:48
【问题描述】:

我阅读了this 很好的实验比较,特别是在vectordeque 容器上调用insert() 的性能。该特定实验(实验 4)的结果是 deque 非常适合此操作。

我使用我编写的一个简短的排序函数实现了我自己的测试,我应该注意它使用了[] 运算符以及其他成员函数,并发现了截然不同的结果。例如,对于插入 100,000 个元素,vector 需要 24.88 秒,而deque 需要 374.35 秒。

我该如何解释呢?我想这与我的排序功能有关,但想了解详细信息!

我正在使用没有优化的 g++ 4.6。

这是程序:

#include <iostream>
#include <vector>
#include <deque>
#include <cstdlib>
#include <ctime>

using namespace std;

size_t InsertionIndex(vector<double>& vec, double toInsert) {
  for (size_t i = 0; i < vec.size(); ++i)
    if (toInsert < vec[i])
      return i;
  return vec.size();  // return last index+1 if toInsert is largest yet                                                                          
}

size_t InsertionIndex(deque<double>& deq, double toInsert) {
  for (size_t i = 0; i < deq.size(); ++i)
    if (toInsert < deq[i])
      return i;
  return deq.size();  // return last index+1 if toInsert is largest yet                                                                          
}

int main() {
  vector<double> vec;
  deque<double> deq;

  size_t N = 100000;

  clock_t tic = clock();
  for(int i = 0; i < N; ++i) {
    double val = rand();
        vec.insert(vec.begin() + InsertionIndex(vec, val), val);
    //        deq.insert(deq.begin() + InsertionIndex(deq, val), val);                                                                           
  }

  float total = (float)(clock() - tic) / CLOCKS_PER_SEC;
  cout << total << endl;
}

【问题讨论】:

  • 告诉我们:1) 您使用的是什么编译器,以及 2) 您是否正在测试优化的构建。
  • 刚刚补充说我正在使用没有优化的 g++,但我不确定如何找出我正在使用的 g++ 版本。
  • 酷,谢谢。
  • vector of double 可能会更快,但如果类类型很大,deque 肯定会更快

标签: c++ vector stl containers deque


【解决方案1】:

dequevector 快得多的特殊情况是当您在容器的前端插入时。在您的情况下,您是在随机位置插入,这实际上会给 vector 带来优势。

此外,除非您使用优化的构建,否则库实现中很有可能存在边界检查。这些检查可以显着增加时间。要进行正确的基准比较,您必须在打开所有正常优化并关闭调试的情况下运行。

【讨论】:

  • 好的,谢谢。我的编译器命令只是g++ filename.cpp。我是否需要添加任何东西来关闭调试,我应该使用哪种优化?例如。 -o2?
  • @bcf:对于 gcc,默认实现不使用检查迭代器,因此只需提升优化器(-O2 或 -O3)就足够了。但比较的重要部分是马克在第一段中提到的。 deque 的优点是 front 的插入和删除(在你链接的文章中顺便提到了)
【解决方案2】:

您的代码正在执行插入排序,即 O(n^2)。迭代 deque 比迭代 vector 慢。

我怀疑您没有看到与发布的链接相同的结果的原因是因为您的程序的运行时由InsertionIndex 中的循环控制,而不是对deque::insert 的调用(或vector::insert

【讨论】:

    猜你喜欢
    • 2012-09-07
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 2017-05-06
    • 2021-09-21
    • 2012-03-27
    • 1970-01-01
    相关资源
    最近更新 更多