Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;地图访问和迭代所花费的时间_C++_C++11_Dictionary_Operators - Fatal编程技术网

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

C++ C++;地图访问和迭代所花费的时间,c++,c++11,dictionary,operators,C++,C++11,Dictionary,Operators,我使用gprof分析代码,我发现->操作符需要花费大量时间 这是地图的示例定义 map<int, vector<int> > myMap; 这是来自分析的数据 Function: std::_Rb_tree_iterator<std::pair<int const, std::vector<ClassType*, std::allocator<ClassType*> > > >::operator->() const

我使用gprof分析代码,我发现->操作符需要花费大量时间

这是地图的示例定义

map<int, vector<int> > myMap;
这是来自分析的数据

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
功能:
std::Rb_树迭代器::运算符->()常量
所用时间:
20.18%
调用函数的次数:
15285739415
功能:
std::_Rb_tree_迭代器::运算符++(int)
所用时间:
2.90%
调用函数的次数:
3825378111
根据我的理解,++运算符计算下一个元素,该元素取
O(log(n))
并->给出应取
O(1)
时间的元素。 尽管->操作符被称为多于++操作符,但我认为它不应该占用那么多时间。 难道
+
不应该比
->
操作符花费更多的时间吗?

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

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

然而,算术运算可能不需要涉及内存访问。如果算术运算中涉及的数据可以放入寄存器,那么就不需要访问最低级别的缓存


这里有一个关于缓存一致性/空间局部性如何影响应用程序速度的示例。

您是否使用优化进行编译?在没有优化的情况下进行评测根本不具有代表性。还要注意,操作符->的调用频率是操作符++的4倍。这是有意的吗?此外,该标准要求迭代器上的所有操作都在连续时间内摊销([iterator.requirements.general]P8)。因此,增量也是O(1),我在编译时没有进行优化。我将尝试使用优化进行编译。->由于我访问内存的频率更高,因此被称为大于++。如果++是O(1),那么哪个操作符计算下一个节点?查看->的函数调用,我认为->不会计算下一个节点。
++
会找到下一个节点。但它这样做时不会再次遍历树(它只需要向上然后向下遍历下一个子树)。这给了摊销的固定时间。哦!好吧知道了。谢谢
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