C++地图访问和迭代所花费的时间
C++ Time Taken in Map Access and Iteration
我正在使用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)
时间的元素。即使 -> 运算符被称为 大于 ++ 运算符,我认为它不应该消耗那么多时间。++
不应该比操作员消耗更多的时间->
吗?
内存访问(->
运算符)通常比算术运算(++
运算符)慢得多。
这是因为搜索数据需要时间,从最低级别(最接近寄存器)的缓存一直到硬盘驱动器中的页面。正如您所料,这需要相当长的时间,您离寄存器越远。
但是,算术运算可能不需要涉及内存访问。如果算术运算中涉及的数据可以放入寄存器,则甚至不需要访问最低级别的缓存。
下面是一篇关于缓存一致性/空间局部性如何影响应用程序速度的好文章。
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 迭代时从向量和内存中删除对象
- 整个循环花费的时间比其迭代总和要长
- 先前循环迭代对当前迭代执行时间的影响
- 您可以在一段时间内迭代向量
- 迭代算法的时间复杂度
- C :在多迭代器中的Next()和PRAV()的运行时间
- 如何记录C 重复迭代函数的总时间
- C :多态容器 /迭代器与编译时间概念 /特征
- 在同一列表的while循环中迭代for循环所需的Big-O时间
- C++地图访问和迭代所花费的时间
- 为什么更改循环迭代顺序会增加运行时间
- C++按时间戳对日志文件内容进行迭代
- 将迭代器返回到多映射中最接近指定时间的时间
- 迭代c++ unordered_map的时间复杂度
- c++ 11线程在迭代循环时间
- 使用 Unix 程序时间计算每次迭代的程序运行时间
- 在生活游戏中分配迭代时间