[英]Does MFC CMap have a good performance compared to std::unordered_map or std::map
與std::unordered_map
或std::map
相比,MFC CMap
是否具有良好的性能,我問這個問題是因為我要在公司中開始一個項目,並且為了加快開發速度,我將從一個現有的項目開始“類似”項目,但在最后一個項目中,有MFC CMap
(哈希表映射),我認為使用std::unordered_map
可能會提高性能。 我在互聯網上找不到任何與CMap
相關的基准或好的文章。 否則,使用std::unordered_map
也必須像在CMap
那樣固定哈希表的大小,以避免沖突和性能問題?
我做了非常簡單的性能比較測試:
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;
以下是Intel Core i5 2.5Ghz 8GB RAM(Lenovo 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
不錯!
20秒搜索“ MFC CMap”
查找使用哈希算法來快速查找具有與給定鍵完全匹配的鍵的map元素。
因此big-O效率將類似於unordered_map
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.