首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

deque的顺序访问性能为何比vector差了10-20倍

2012-12-15 
deque的顺序访问性能为什么比vector差了10-20倍?从数据结构和算法的角度讲,vector/deque随机访问某个元素

deque的顺序访问性能为什么比vector差了10-20倍?
从数据结构和算法的角度讲,vector/deque随机访问某个元素的时间复杂度都是O(1),但是vector是C++标准规定了要用连续存储的,而deque是分块,下标访问操作需要计算一次位置。但是他们两个的顺序访问性能不应该差了10-20倍吧。下面的小程序是我用VC2010编译的release版运行的高精度计时器,运行的结果是

实验1: 采用[]下标访问,vector用了3秒,而deque用了60秒(一分钟)。
实验2: 采用迭代器顺序访问,vector用了2秒,deque用了21秒。

这个差距也太大了点。为什么会这样呢? 

实验1代码:

C/C++ code
#include "stdafx.h" #include<Windows.h> #include<vector> #include<deque> #include<list> using namespace std; LARGE_INTEGER Frequency,PerformanceCount1,PerformanceCount2; void fTime0(){ QueryPerformanceFrequency(&Frequency); } void fTime1(){      QueryPerformanceCounter(&PerformanceCount1); } void fTime2(){         QueryPerformanceCounter(&PerformanceCount2);      int tdiff=static_cast<int>((           ((PerformanceCount2.QuadPart - PerformanceCount1.QuadPart) * 1000)/Frequency.QuadPart));      printf("%d,",tdiff); } int main(int argc,char*[]){      size_t s=argc*262144;      fTime0();      {          vector<int> vi(s);          fTime1();          for( int j=0;j<10000;++j)          {              for( decltype(s) l=0;l<s;++l )              {                  vi[l]=argc;                  vi[l]+=l;              }          }          fTime2();      }      {          deque<int> di(s);          fTime1();          for( int j=0;j<10000;++j)          {              for( decltype(s) l=0;l<s;++l )              {                  di[l]=argc;                  di[l]+=l;              }          }          fTime2();      }        return 0; } 


实验2代码:
C/C++ code
int main(int argc,char*[]){      size_t s=argc*262144;      fTime0();      {          vector<int> vi(s);          fTime1();          for( int j=0;j<10000;++j)          {              for( auto it=vi.begin();it!=vi.end();++it )              {                  *it=argc;                  *it+=j;              }          }          fTime2();      }      {          deque<int> di(s);          fTime1();          for( int j=0;j<10000;++j)          {              for( auto it=di.begin();it!=di.end();++it )              {                  *it=argc;                  *it+=j;            }          }          fTime2();      }      return 0; } 

热点排行
Bad Request.