C++地图访问和迭代所花费的时间

C++ Time Taken in Map Access and Iteration

本文关键字:时间 迭代 地图 访问 C++      更新时间:2023-10-16

我正在使用gprof分析代码,我观察到->消耗大量时间的运算符。

这是地图的示例定义。

map<int, vector<int> > myMap;

我有一个迭代器,

map<int, vector<int> >::iterator it;

我经常运行这样的循环:

for(it = myMap.begin(), it != myMap.end(); it++) {
   //Do stuff
}

这是来自分析的数据

Function:
std::_Rb_tree_iterator<std::pair<int const, std::vector<ClassType*, std::allocator<ClassType*> > > >::operator->() const
Time Consumed:
20.18%
Number of Times function is called:
15285739415
Function:
std::_Rb_tree_iterator<std::pair<int const, std::vector<ClassType*, std::allocator<ClassType*> > > >::operator++(int)
Time Consumed:
2.90%
Number of Times function is called:
3825378111

根据我的理解,++ 运算符计算O(log(n))的下一个元素,而 -> 给出应该花费O(1)时间的元素。即使 -> 运算符被称为 大于 ++ 运算符,我认为它不应该消耗那么多时间。++不应该比操作员消耗更多的时间->吗?

内存访问(->运算符)通常比算术运算(++运算符)慢得多。

这是因为搜索数据需要时间,从最低级别(最接近寄存器)的缓存一直到硬盘驱动器中的页面。正如您所料,这需要相当长的时间,您离寄存器越远。

但是,算术运算可能不需要涉及内存访问。如果算术运算中涉及的数据可以放入寄存器,则甚至不需要访问最低级别的缓存。

下面是一篇关于缓存一致性/空间局部性如何影响应用程序速度的好文章。