【问题标题】:Why is list iteration faster than vector iteration C++ [closed]为什么列表迭代比向量迭代C++更快[关闭]
【发布时间】:2013-05-28 05:04:27
【问题描述】:

我有以下代码:

main() {
  vector<int> v (1000,0);
  list<int> l (1000,0);

  clock_t begin,end;

  cout <<"Vector size: "<<v.size()<<endl;
  cout <<"List size: "<<l.size()<<endl;

  begin=clock();
  for (int i=0;i<1000000;i++)
    for (vector <int>::iterator it=v.begin();it!=v.end();it++);
  end=clock();

  cout <<v[0]<<endl;
  cout << "Vector iteration: " << (double)(end-begin)/CLOCKS_PER_SEC <<endl;


  begin=clock();
  for (int i=0;i<1000000;i++)
    for (list <int>::iterator it=l.begin();it!=l.end();it++);
  end=clock();

  list <int>::iterator it=l.begin();
  cout << *it <<endl;
  cout << "List iteration: " << (double)(end-begin)/CLOCKS_PER_SEC <<endl;
}

我得到的结果是向量迭代(大约)18.3 秒,列表迭代是 (大约)11.7 秒。这怎么可能?我的测量有问题吗?

感谢您的帮助!

【问题讨论】:

  • 我在 O3 上得到 vector 为 0 和 list 为 1.707。
  • 我得到的结果与 Jerry 基本相同。启用调试模式后,我发现 List 比向量慢一点(但我必须将周期数减少到 1000 才能在合理的时间内完成它。)
  • 这是一个免费的-1,用于在没有优化的情况下进行基准测试。

标签: c++ performance stl


【解决方案1】:

根据您列出的时间量(每次 10-20 秒),您几乎可以肯定您正在编译时禁用了优化1。这会使您的结果基本上毫无意义。

在我(大约 7 岁的)机器上进行快速测试,启用优化后,向量的时间为 0,列表的时间约为 1.2-1.5 秒(VC++ 为 1.2,g++ 为 1.5)。

禁用优化后,它们都会变慢(很多)。使用 VC++,我看到向量的时间约为 38 秒,列表的时间约为 43 秒。使用 g++,这些更像是 36 秒的向量和 29 秒的列表。后者(大致)与您所看到的相匹配(以我明显较旧/较慢的计算机为模),所以我猜您使用的是禁用优化的 g++。

底线:您所看到的可能几乎完全是代码碰巧编写的产物(例如,可能是向量代码中的额外函数调用)。这与向量或列表本身的内在效率完全无关。


  1. 仅出于完整性考虑:我想您至少可以通过在一台非常旧、速度慢的计算机上运行代码来获得至少接近该范围的结果。由于我们所说的速度大约比当前计算机慢 20 倍,因此可以想象 150 到 233(左右)MHz Pentium 可以按照一般顺序给出结果。对于这么旧的 CPU,很多用于优化当前代码的假设可能并不真正适用,所以我想几乎无法想象某些事情会适得其反,以至于你最终会得到更快的列表。即使到那时我也不会真的期待它,但由于编译器期望的 CPU 与您将运行它的 CPU 之间存在如此不匹配,几乎一切皆有可能。

【讨论】:

    猜你喜欢
    • 2012-01-31
    • 2023-04-06
    • 1970-01-01
    • 2012-11-17
    • 2022-11-25
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    相关资源
    最近更新 更多