適当にテスト。
当然ながらKeyがlongでInitHashTable()したやつがいっちゃん速かった。
Key:CStringと比べて数倍早い
// Key:CStringでInitHashTable()なし
// CString keyがループの中
{
long tick = GetTickCount();
CMap<CString ,LPCTSTR,long,long& > mapdata;
for(int i=0;i<1000000;i++){
CString key;
key.Format(_T("%dt"));
mapdata[key] = i;
}
long time = GetTickCount()-tick;
CString mess;
mess.Format(_T("%dms(1)"),time);
AfxMessageBox(mess);
}
// Key:CStringでInitHashTable()あり
// CString keyがループの中
{
long tick = GetTickCount();
CMap<CString ,LPCTSTR,long,long& > mapdata;
mapdata.InitHashTable(1200000); // 20%増し
for(int i=0;i<1000000;i++){
CString key;
key.Format(_T("%dt"));
mapdata[key] = i;
}
long time = GetTickCount()-tick;
CString mess;
mess.Format(_T("%dms(1-2)"),time);
AfxMessageBox(mess);
}
// Key:CStringでInitHashTable()なし
// CString keyがループの外
{
long tick = GetTickCount();
CString key;
CMap<CString ,LPCTSTR,long,long& > mapdata;
for(int i=0;i<1000000;i++){
key.Format(_T("%dt"));
mapdata[key] = i;
}
long time = GetTickCount()-tick;
CString mess;
mess.Format(_T("%dms(2)"),time);
AfxMessageBox(mess);
}
// Key:CStringでInitHashTable()あり
// CString keyがループの外
{
long tick = GetTickCount();
CString key;
CMap<CString ,LPCTSTR,long,long& > mapdata;
mapdata.InitHashTable(1200000); // 20%増し
for(int i=0;i<1000000;i++){
key.Format(_T("%dt"));
mapdata[key] = i;
}
long time = GetTickCount()-tick;
CString mess;
mess.Format(_T("%dms(2-2)"),time);
AfxMessageBox(mess);
}
// Key:longでInitHashTable()あり (なしだと死ぬほど処理時間長かった)
{
long tick = GetTickCount();
CMap<long ,long,long,long& > mapdata;
mapdata.InitHashTable(1200000); // 20%増し
for(int i=0;i<1000000;i++){
//key.Format(_T("%dt"));
long key = i<<8;
key |= 0xff;
mapdata[key] = i;
}
long time = GetTickCount()-tick;
CString mess;
mess.Format(_T("%dms(3)"),time);
AfxMessageBox(mess);
}