適当にテスト。
当然ながら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); }