読者です 読者をやめる 読者になる 読者になる

CMapの速度テスト

MFC

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