二维数组和vector性能差别怎么这么大?

yingle2000 2007-06-16 04:39:02
int tmp[256][256];
int a[256][256];
std::vector<std::vector<int> >vtmp;
//设置vtmp元素个数为[256][256],对tmp,vtmp中的元素进行赋值,使tmp[i][j] == vtmp[i][j]。
//...
time_t now;
now = time(NULL);
cout << ctime(&now) << endl;
for(int n = 0; n < 4096; n++)
for(int i = 0; i < 256; i++)
for(int j = 0; j < 256; j++)
{
a[i][j] = tmp[i][j];
a[i][j] += tmp[i][j];
a[i][j] /= tmp[i][j];
}
now = time(NULL);
cout << ctime(&now) << endl;
这段程序大约2次cout之间的时间差为10秒左右,但是把其中的tmp[i][j]改成vtmp[i][j]之后,程序运行了几分钟还没有结束。
不是说vector的性能基本相当于数组吗?怎么差别这么大?
...全文
4072 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
zll000111 2011-12-19
  • 打赏
  • 举报
回复
看完这一贴,在VS2010上做了一个测试。就用楼主的程序,如下:

#include <vector>
#include <ctime>
#include <iostream>
using namespace std;

void main()
{
clock_t t1,t2;
int tmp[256][256];
int a[256][256];
vector < vector <int> > vtmp;
for (int i = 0; i < 256; ++i) {
vector <int> t;
vtmp.push_back(t);
for (int j = 0; j < 256; ++j) {
tmp[i][j] = j + 1;
vtmp[i].push_back(j + 1);
}
}
t1 = clock();
for(int n = 0; n < 4096; n++)
for(int i = 0; i < 256; i++)
for(int j = 0; j < 256; j++)
{
a[i][j] = tmp[i][j];
a[i][j] += tmp[i][j];
a[i][j] /= tmp[i][j];
}
t2 = clock();
cout<< t2-t1 <<endl;

t1 = clock();
for(int n = 0; n < 4096; n++)
for(int i = 0; i < 256; i++)
for(int j = 0; j < 256; j++)
{
a[i][j] = vtmp[i][j];
a[i][j] += vtmp[i][j];
a[i][j] /= vtmp[i][j];
}
t2 = clock();
cout<< t2-t1 <<endl;
}
结果为:
Debug 情况:
使用array: 2.781s
使用vector: 112.063s
Release情况
使用array:0.140s
使用vector: 0.047s
这是什么情况,难道在VS2010中,对Vector的优化已经到了变态的地步么?

sdytdhl 2010-10-15
  • 打赏
  • 举报
回复
mark
ForEverFlying 2008-06-09
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 yingle2000 的回复:]
昨天回去研究了一下,VC6的vector和VC2005的vector确实有很大不同,其中的iterator也更加不同,VC6就直接是_Ty*了,而VC2005的话是一个template class,性能相差很多。由于当时测试的时候没有在统一的环境下,导致结果有些偏差。现在觉得有必要在性能要求比较高的地方使用动态分配的数组了。

另外,boost::array的大小好像需要在编译期确定的,图像处理的话需要动态分配,不是很适合。
[/Quote]
多维数组可以用boost::multi_array,内部实现方式基本与多维数组相同,大小是在运行时指定的。
newbee 2007-07-12
  • 打赏
  • 举报
回复
mark
healer_kx 2007-06-26
  • 打赏
  • 举报
回复
已经很快了。
yingle2000 2007-06-26
  • 打赏
  • 举报
回复
昨天回去研究了一下,VC6的vector和VC2005的vector确实有很大不同,其中的iterator也更加不同,VC6就直接是_Ty*了,而VC2005的话是一个template class,性能相差很多。由于当时测试的时候没有在统一的环境下,导致结果有些偏差。现在觉得有必要在性能要求比较高的地方使用动态分配的数组了。

另外,boost::array的大小好像需要在编译期确定的,图像处理的话需要动态分配,不是很适合。
yuyunliuhen 2007-06-26
  • 打赏
  • 举报
回复
mark
hwkobeliulili 2007-06-25
  • 打赏
  • 举报
回复
啊,呵呵没怎么看懂!
yingle2000 2007-06-25
  • 打赏
  • 举报
回复
十分感谢大家的回答,最近几天在忙其他事情,都没有上来看。另外,现在要做的正式有关图形处理方面的,所以比较关注性能方面的问题。我这几天再去试一下大家说的
longshanks 2007-06-18
  • 打赏
  • 举报
回复
还有一点需要注意。vc2005里的stl使用了所谓“checked iterator”。使用checked iterator时,当访问了无效的iterator,会产生异常或终止程序。也就是说,checked iterator如其名所示,在执行iterator操作时,对iterator的有效性进行检验。这势必增加了运行开销。
更重要的是,默认情况下,checked iterator的开关是打开的。所以,如果在release版本下比较vector和内置数组之间的性能时,发现差很多,那么请不要惊讶。可能是checked iterator在作怪。
taodm 2007-06-18
  • 打赏
  • 举报
回复
影响程序性能的主要因素是架构,然后是算法,至于数据结构,一般不能对性能造成重大影响,不要太关注这些话题。
性能测试,是一个很难的话题。
dazhuaye 2007-06-18
  • 打赏
  • 举报
回复
MARE
jkl88 2007-06-18
  • 打赏
  • 举报
回复
intel多核程序设计比赛讨论群6318711
AWolfBoy 2007-06-18
  • 打赏
  • 举报
回复
使用boost::array,这个与直接使用数组效率几乎等值
milksea 2007-06-18
  • 打赏
  • 举报
回复
nod,我觉得vector还是很快的。
erben 2007-06-18
  • 打赏
  • 举报
回复
个人觉得如果不是做图像处理之类巨大运算量的程序,没有必要性能发烧,请信任STL的效率,那点运行效率的降低比它带给你的方便是微不足道的。。
Inhibitory 2007-06-18
  • 打赏
  • 举报
回复
看来性能测试还真不容易。
DLMU_net 2007-06-18
  • 打赏
  • 举报
回复
mark ~~~学习了
a524503467 2007-06-18
  • 打赏
  • 举报
回复
小小的一个程序可以看去 在好的模式下:
vector确实比数组逊色 能节省一点时间是一点
这对程序员很关键
Vitin 2007-06-17
  • 打赏
  • 举报
回复
在GCC和VC6中,vector的代码没有debug和release的区别(看过源码了)。
但是在VS2005中,确实有。

VS2005的优化开关默认是全部打开的,所以可以优化的部分,都会优化到。
又试了一下关闭所有优化开关的情况,数组是8-9秒(和debug下完全一样);
vector在release下是28秒,在debug下,遥遥无期(我等了8分种,还没有结果)。

这说明(在VS2005中),对数组而言,release和debug是一样的(废话);
对vector而言,是不一样的。
同时,优化对vector也是有效的,而且效果很大。
但是,vector还是比数组慢,无论优化与否,无论优化多少。

当然,这是由STL版本造成的。相信在VS2005中使用VC6或GCC的STL,也能达到数组的性能。
加载更多回复(28)

64,688

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧