C++ 与std::无序_图或std::map相比,MFC CMap的性能好吗

C++ 与std::无序_图或std::map相比,MFC CMap的性能好吗,c++,mfc,hashmap,unordered-map,C++,Mfc,Hashmap,Unordered Map,MFCCMap与std::unordered_map或std::map相比是否有良好的性能,我问这个问题是因为我将在我的公司启动一个项目,为了加速开发,我将从一个现有的“类似”项目开始,但在最后一个项目中,有MFCCMap(哈希表映射)我认为使用std::unordered_map可以提高性能。我在互联网上没有找到任何与CMap相关的基准测试或好文章。 否则,使用std::unordered_map时,我是否必须像在CMap中一样为哈希表确定一个大小,以避免冲突和性能问题?搜索“MFC CMap

MFC
CMap
std::unordered_map
std::map
相比是否有良好的性能,我问这个问题是因为我将在我的公司启动一个项目,为了加速开发,我将从一个现有的“类似”项目开始,但在最后一个项目中,有MFC
CMap
(哈希表映射)我认为使用
std::unordered_map
可以提高性能。我在互联网上没有找到任何与
CMap
相关的基准测试或好文章。
否则,使用
std::unordered_map
时,我是否必须像在
CMap
中一样为哈希表确定一个大小,以避免冲突和性能问题?

搜索“MFC CMap”需要20秒

查找使用哈希算法快速查找具有 与给定密钥完全匹配的密钥


因此,big-O效率将类似于
无序图

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

int nElements = 1000000;
CMap<int, int, CString, LPCTSTR> MfcHashTable;
MfcHashTable.InitHashTable(nElements);

// CMap insert
DWORD dwStart = ::GetTickCount();
for(int i=0; i<nElements; i++)
{
    CString sBase;
    sBase.AppendFormat(_T("Test String %d"), i);
    MfcHashTable[i] = sBase;
}

DWORD dwMfcMapInsert = ::GetTickCount() - dwStart;

// CMap lookup
CString sValue;

dwStart = ::GetTickCount();
for(int i=0; i<nElements; i++)
{
    MfcHashTable.Lookup(i, sValue);
}
DWORD dwMfcMapLookup = ::GetTickCount() - dwStart;

// std::map insert
std::map<int, CString> StdMap;
dwStart = ::GetTickCount();
for(int i=0; i<nElements; i++)
{
    CString sBase;
    sBase.AppendFormat(_T("Test String %d"), i);
    StdMap[i] = sBase;
}
DWORD dwStdMapInsert = ::GetTickCount() - dwStart;

//std::map lookup
dwStart = ::GetTickCount();
std::map<int, CString>::iterator it;
for(int i=0; i<nElements; i++)
{
    it = StdMap.find(i);
    CString sBase = it->second;
}
DWORD dwStdMapLookup = ::GetTickCount() - dwStart;

// std::unordered_map insert (hash table)
std::unordered_map<int, CString> StdUnordMap;
dwStart = ::GetTickCount();
for(int i=0; i<nElements; i++)
{
    CString sBase;
    sBase.AppendFormat(_T("Test String %d"), i);
    StdUnordMap[i] = sBase;
}
DWORD dwStdUnordMapInsert = ::GetTickCount() - dwStart;

//std::map lookup
dwStart = ::GetTickCount();
std::unordered_map<int, CString>::iterator it1;
for(int i=0; i<nElements; i++)
{
    it1 = StdUnordMap.find(i);
    CString sBase = it1->second;
}
DWORD dwStdUnordMapLookup = ::GetTickCount() - dwStart;

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

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

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

因此,令人惊讶的是,
CMap
是这里的赢家。事实证明,丑陋的传统
CMap
毕竟没有那么糟糕

我在网上找不到任何与CMap相关的基准测试或好文章,为什么不在生产中使用与生产中使用的硬件类似的数据集对自己进行基准测试?CMap没有移动支持(如果要从函数返回参数,必须始终将其作为输出参数传递)在调试器中,在显示窗口中不显示任何有用的代码。您还必须编写代码,如“代码> CMAP MAP;<代码> >而不是<代码> STD::无序的映射图;< /代码>。如果我是您,我甚至不会考虑使用它。但这取决于您。CMAP是过时的、不可移植的恐怖节目。请大家帮忙:使用标准容器和HE。lp永远埋葬MFC。选择新MFC项目的
std::map
std::unordered_map
。我将远离所有MFC容器,除了
CString
——另请参见@Aminos我理解这个问题,但白痴软件经理需要接受教育,否则软件开发的纪律将被保留再过20年,如果你包括销毁,CMap会更快,因为它使用的内存块与池分配器相当。如果你仔细研究代码的构造,很明显MFC映射“更好”。)即使它过时了。有趣的是,我也做了一个基准测试,我使用一个大的txt字典文件和高性能coutner中的单词来测量时间,但我犯了一个错误,对于std::unordered_map,我使用std::string类型作为值或键,而对于CMAP,我使用CString,因此在这种情况下,unordered_map比CMAP快(几十毫秒),我将重写我的基准,并为每个人使用CString(因为我无法将std::string作为值放入CMap中,我不记得它为什么不起作用)我认为测试对
CMap
有利,因为大小是已知的(
InitHashTable
),如果大小较大且未知,则速度会慢得多。同时,
unordered_map
没有利用
reserve
。只有
CMap
的查找速度更快。你是对的。我没有使用它的原因是因为
reserve()
未在VS2010中为无序映射实现
。无论如何,我实现了如下保留:
StdUnordMap.rehash(std::ceil(neelements/StdUnordMap.max\u load\u factor())
结果如下:1312用于插入,140用于查找。稍微好一点,但仍然不是最好的。只要不使用池分配器,MFC映射将击败无序的映射,特别是当您有很多条目的时候。当哈希映射只是为临时操作创建时,删除所有项的销毁阶段是无效的这不是一个“短”的行动。请下一位选民解释一下好吗?问题是CMap是否与
map
unordered\u map
有类似的表现。我回答说它将与
unordered\u map
相似。为什么这是一个糟糕的答案?
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