我使用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;运算符被称为多于++运算符,我认为它不应该消耗那么多时间。
++
运算符不应该->
消耗更多时间吗?
答案 0 :(得分:0)
内存访问(->
运算符)通常比算术运算(++
运算符)慢得多。
这是因为搜索数据需要时间,从最低级别(最接近寄存器)的缓存开始一直到硬盘驱动器中可能的页面。正如您所预料的那样,离寄存器越远,这需要相当长的时间。
但是,算术运算可能不需要涉及内存访问。如果算术运算中涉及的数据可以适合寄存器,则不需要访问最低级别的缓存。以下是关于缓存一致性/空间位置如何影响应用程序速度的good article。