簡體   English   中英

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

[英]Does MFC CMap have a good performance compared to std::unordered_map or std::map

std::unordered_mapstd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM