C++ 为什么不是';删除std::map线性时间中的对象?或者:在std::map中删除对象的最快方法是什么?
编辑:永远不要对调试版本进行评测。。。一旦我切换到释放,就不会有明显的延迟,而且时间是线性的。创建和删除1000000个对象的时间总共为370毫秒 -- 我有一个包含指向对象指针的映射:C++ 为什么不是';删除std::map线性时间中的对象?或者:在std::map中删除对象的最快方法是什么?,c++,stdmap,c++98,C++,Stdmap,C++98,编辑:永远不要对调试版本进行评测。。。一旦我切换到释放,就不会有明显的延迟,而且时间是线性的。创建和删除1000000个对象的时间总共为370毫秒 -- 我有一个包含指向对象指针的映射:std::map myMap 当我删除地图时,我注意到地图越大,似乎需要的时间就越长,而且是指数级的。我期待着线性行为 虽然在地图上干迭代(实际上什么都不做)的行为或多或少是线性的,但删除对象(不修改地图!!)会彻底失败。有人对这种行为有什么解释吗?更重要的是:我能做些什么来加快速度?因为不幸的是,我确实有一个6
std::map myMap
当我删除地图时,我注意到地图越大,似乎需要的时间就越长,而且是指数级的。我期待着线性行为
虽然在地图上干迭代(实际上什么都不做)的行为或多或少是线性的,但删除对象(不修改地图!!)会彻底失败。有人对这种行为有什么解释吗?更重要的是:我能做些什么来加快速度?因为不幸的是,我确实有一个60000多个对象的案例,清理我的地图花费了太长时间
代码如下:
class DummyObject
{
public:
DummyObject() {}
~DummyObject() {}
};
void testSpeed( int iMapSize )
{
const unsigned int uiStart = GetTickCount();
typedef std::map<int, DummyObject *> T_MyMap;
T_MyMap myMap;
// Fill the map...
for( int i = 0; i < iMapSize; i++ ) {
myMap[i] = new DummyObject();
}
const unsigned int uiFilled = GetTickCount();
// Dry iteration through the map...
for( T_MyMap::const_iterator it = myMap.begin(); it != myMap.end(); it++ ) {
int i = 0; // do something
}
const unsigned int uiIterate = GetTickCount();
// Delete the map...
for( T_MyMap::const_iterator it = myMap.begin(); it != myMap.end(); it++ ) {
delete it->second;
}
const unsigned int uiDeleted = GetTickCount();
myMap.clear();
const unsigned int uiCleared = GetTickCount();
DebugText( arg( "MapSize: %1 --- ", iMapSize )
+ arg( "filled: %1 msecs; ", uiFilled - uiStart )
+ arg( "iterate: %1 msecs; ", uiIterate - uiFilled )
+ arg( "deleted: %1 msecs; ", uiDeleted - uiIterate )
+ arg( "cleared: %1 msecs; ", uiCleared - uiDeleted )
+ arg( "total: %1 msecs; ", uiCleared - uiStart ) );
}
。。。这是我得到的输出:
MapSize: 100 --- filled: 0 msecs; iterate: 0 msecs; deleted: 16 msecs; cleared: 0 msecs; total: 16 msecs;
MapSize: 1000 --- filled: 31 msecs; iterate: 0 msecs; deleted: 15 msecs; cleared: 0 msecs; total: 46 msecs;
MapSize: 10000 --- filled: 203 msecs; iterate: 16 msecs; deleted: 47 msecs; cleared: 15 msecs; total: 281 msecs;
MapSize: 100000 --- filled: 2527 msecs; iterate: 250 msecs; deleted: 1435 msecs; cleared: 234 msecs; total: 4446 msecs;
MapSize: 1000000 --- filled: 34055 msecs; iterate: 2652 msecs; deleted: 172241 msecs; cleared: 1981 msecs; total: 210929 msecs;
我宁愿责怪分配者也不愿责怪地图。用一个普通的c数组你会得到什么结果?我认为计算是错的
+arg(“删除:%1毫秒;”,uiDeleted-uiFilled)
应该是+arg(“删除:%1毫秒;”,uiDeleted-uiIterate)
我完全同意Adrian上面的评论。而且,它似乎非常依赖于实现:根据我在XCode 6中的测试,我得到了所有分析操作的或多或少的线性结果。(我不会将实际数据作为注释发布,因为格式化很麻烦)无法在win8上复制gcc 4.9.1(总时间),您确定要启用优化吗?Mac OS上的Clang 3.5提供MapSize:1000000---filled:431毫秒;迭代:29毫秒;删除:178毫秒;清除:259毫秒;总计:868毫秒
。即使禁用了优化,也只需要2-3倍的时间。这是在一台可怜的3年前的1.6GHz笔记本电脑上。
MapSize: 100 --- filled: 0 msecs; iterate: 0 msecs; deleted: 16 msecs; cleared: 0 msecs; total: 16 msecs;
MapSize: 1000 --- filled: 31 msecs; iterate: 0 msecs; deleted: 15 msecs; cleared: 0 msecs; total: 46 msecs;
MapSize: 10000 --- filled: 203 msecs; iterate: 16 msecs; deleted: 47 msecs; cleared: 15 msecs; total: 281 msecs;
MapSize: 100000 --- filled: 2527 msecs; iterate: 250 msecs; deleted: 1435 msecs; cleared: 234 msecs; total: 4446 msecs;
MapSize: 1000000 --- filled: 34055 msecs; iterate: 2652 msecs; deleted: 172241 msecs; cleared: 1981 msecs; total: 210929 msecs;