C ++地图访问和迭代时间

时间:2016-03-02 12:43:38

标签: c++ c++11 dictionary operators

我使用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))和 - &gt;的下一个元素。给出应该花费O(1)时间的元素。 即使 - &gt;运算符被称为多于++运算符,我认为它不应该消耗那么多时间。 ++运算符不应该->消耗更多时间吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

以下是关于缓存一致性/空间位置如何影响应用程序速度的good article