求讨论C++map与vecotr的遍历性能

zyb_debug 2011-12-20 05:17:43
std::vector<int> vecTest;
std::map<int,int> mapTest;


const int nTestCount = 5000000;
vecTest.resize(nTestCount);
for (int i = 0;i < nTestCount;i++)
{
vecTest[i] = i;
mapTest[i] = i;
}


DWORD dwTime1 = timeGetTime();
std::vector<int>::iterator iterVec = vecTest.begin();
for (;iterVec != vecTest.end();iterVec++)
{

}
DWORD vectimeCost = timeGetTime() - dwTime1;


dwTime1 = timeGetTime();
std::map<int,int>::iterator iterMap = mapTest.begin();
for (;iterMap != mapTest.end();iterMap++)
{
}
DWORD mapTimeCost = timeGetTime() - dwTime1;

std::cout << "VectorCost:" << vectimeCost << std::endl;
std::cout << "MapCost:" << mapTimeCost << std::endl;


500W级别的性能测试,前后相差1秒
输出:
VectorCost:8967
MapCost:10680

得出结论,vecotor和map的遍历性能是一样的。
求解释,先来先得分
...全文
1582 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
IVERS0N 2011-12-21
  • 打赏
  • 举报
回复
vector好像不是简单的数组吧
对象 2011-12-21
  • 打赏
  • 举报
回复
LZ测试的运算数量级有点小了,map是非线性空间,遍历的话需要访问跨界内存,效率肯定低于vector。
beef9999 2011-12-20
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yisikaipu 的回复:]
debug?

vs 2008 release 非优化

C/C++ code

VectorCost:411
MapCost:748
请按任意键继续. . .


vs 2008 release 速度优化

C/C++ code

VectorCost:16
MapCost:137
请按任意键继续. . .
[/Quote]

怎么设置编译的时候为优化模式????
yisikaipu 2011-12-20
  • 打赏
  • 举报
回复
debug?

vs 2008 release 非优化
VectorCost:411
MapCost:748
请按任意键继续. . .


vs 2008 release 速度优化
VectorCost:16
MapCost:137
请按任意键继续. . .

qq120848369 2011-12-20
  • 打赏
  • 举报
回复
vector是数组,一个挨着一个,当然快了.
map是树,想看下一个说不定得往上走走,往下走走,而且地址还不是相邻的,根据局部性原理是很慢得.
zyb_debug 2011-12-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mingliang1212 的回复:]

C/C++ code



_Myiter& operator++()
{ // preincrement
if (_Mytree::_Isnil(_Ptr))
; // end() shouldn't be incremented, don't move
else if (!_Mytree::……
[/Quote]
确实是有消耗
nevergone 2011-12-20
  • 打赏
  • 举报
回复
没什么好讨论的
一个是连续空间
一个是非连续空间

就像讨论:
数组和二叉树的遍历
majia2011 2011-12-20
  • 打赏
  • 举报
回复
快是因为iterator实现得好,去看一下就知道原因了,也没几行代码
iamnobody 2011-12-20
  • 打赏
  • 举报
回复



_Myiter& operator++()
{ // preincrement
if (_Mytree::_Isnil(_Ptr))
; // end() shouldn't be incremented, don't move
else if (!_Mytree::_Isnil(_Mytree::_Right(_Ptr)))
_Ptr = _Mytree::_Min(
_Mytree::_Right(_Ptr)); // ==> smallest of right subtree
else
{ // climb looking for right subtree
_Nodeptr _Pnode;
while (!_Mytree::_Isnil(_Pnode = _Mytree::_Parent(_Ptr))
&& _Ptr == _Mytree::_Right(_Pnode))
_Ptr = _Pnode; // ==> parent while right subtree
_Ptr = _Pnode; // ==> parent (head if end())
}
return (*this);
}



能看出这里面有个循环吗?
zyb_debug 2011-12-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mingliang1212 的回复:]

引用楼主 zyb_debug 的回复:
C/C++ code
std::vector<int> vecTest;
std::map<int,int> mapTest;


const int nTestCount = 5000000;
vecTest.resize(nTestCount);
for (int i = 0;i < nTestCount;i++)
{
……

……
[/Quote]

数据摆在这里。
map也就是从left节点遍历到right。消耗也只是函数寻址的消耗。你不能说服我
iamnobody 2011-12-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 zyb_debug 的回复:]
C/C++ code
std::vector<int> vecTest;
std::map<int,int> mapTest;


const int nTestCount = 5000000;
vecTest.resize(nTestCount);
for (int i = 0;i < nTestCount;i++)
{
……
[/Quote]

map的遍历性能远不如vector,也不如list.前者用红黑树实现的(遍历方式可不是二叉树的深度优先遍历,虽然结果可能是一样)
之所以相似只是因为你测试的数据太小,得到结果不可靠.还有没有在优化的情况下比较.

map是查找专用的,不擅长遍历.
合理地用stl
数据并不能说明太多的问题,只有清楚他的实现才能知道为什么会有差别.
详见:数据结构与算法:复杂度是什么>
zyb_debug 2011-12-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mougaidong 的回复:]

楼主问这个问题,是因为您认为性能应该有什么样的差别?
[/Quote]
是因为身旁的朋友说map遍历要比vector耗性能耗的很多
turing-complete 2011-12-20
  • 打赏
  • 举报
回复
楼主问这个问题,是因为您认为性能应该有什么样的差别?

684

社区成员

发帖
与我相关
我的任务
社区描述
智能路由器通常具有独立的操作系统,包括OpenWRT、eCos、VxWorks等,可以由用户自行安装各种应用,实现网络和设备的智能化管理。
linuxpython 技术论坛(原bbs)
社区管理员
  • 智能路由器社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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