当前位置:  开发笔记 > 编程语言 > 正文

与std :: unordered_map或std :: map相比,MFC CMap是否具有良好的性能

如何解决《与std::unordered_map或std::map相比,MFCCMap是否具有良好的性能》经验,为你挑选了1个好方法。

不MFC CMap相比有不错的表现std::unordered_map还是std::map,我问这个问题,因为我打算在我公司启动一个项目,并加快我要开始发展与现有的"类似"的项目,但在最后,有MFC CMap(哈希表映射)ans我认为使用std::unordered_map可以增加性能.我没有找到任何与CMap互联网相关的基准或好文章.否则,std::unordered_map我是否必须修改哈希表的大小,CMap以避免冲突和性能问题?



1> Andrew Komia..:

我做了非常简单的性能对比测试:

int nElements = 1000000;
CMap MfcHashTable;
MfcHashTable.InitHashTable(nElements);

// CMap insert
DWORD dwStart = ::GetTickCount();
for(int i=0; i StdMap;
dwStart = ::GetTickCount();
for(int i=0; i::iterator it;
for(int i=0; isecond;
}
DWORD dwStdMapLookup = ::GetTickCount() - dwStart;

// std::unordered_map insert (hash table)
std::unordered_map StdUnordMap;
dwStart = ::GetTickCount();
for(int i=0; i::iterator it1;
for(int i=0; isecond;
}
DWORD dwStdUnordMapLookup = ::GetTickCount() - dwStart;

cout << dwMfcMapInsert << endl;
cout << dwMfcMapLookup << endl;

cout << dwStdMapInsert << endl;
cout << dwStdMapLookup << endl;

cout << dwStdUnordMapInsert << endl;
cout << dwStdUnordMapLookup << endl;

以下是英特尔酷睿i5 2.5Ghz 8GB内存(联想ThinkPad X230)1000000个元素的结果:

MFC CMap insert: 1125
MFC CMap lookup: 125
std::map insert: 1406
std::map lookup: 172
std::unordered_map insert: 1578
std::unordered_map lookup: 140

令人惊讶的CMap是,这里是胜利者.事实证明,丑陋的遗产CMap毕竟不是那么糟糕!


如果你包括破坏.CMap甚至更快,因为它使用与池分配器相当的内存块.如果你研究一下代码的结构,就可以清楚地看到MFC Map是"更好"的.;)即使它已经过时了.
我认为该测试对`CMap`有利,因为它的大小是已知的(`InitHashTable`),如果大小很大且未知,则速度会慢得多。同时,`unordered_map`没有利用`reserve`的优势。仅查找对于CMap而言更快。
你是对的.我没有使用它的原因是因为在VS2010中没有为`unordered_map`实现`reserve()`.无论如何我已经实现了如下保留:`StdUnordMap.rehash(std :: ceil(nElements/StdUnordMap.max_load_factor()));`结果如下:1312表示插入,140表示查找.好一点但仍然不是最好的.
只要您不使用池分配器,当您有大量条目时,MFC映射将特别击败unordered_map.当刚刚为临时动作创建哈希映射时,删除所有项目的破坏阶段不是"短"动作.
推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有