-1

我有以下代码:

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 秒的结果。这怎么可能?我的测量有问题吗?

谢谢你的帮助!

4

1 回答 1

6

根据您列出的时间量(每次 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 之间存在如此不匹配,几乎任何事情都是可能的。
于 2013-05-28T05:25:14.483 回答