背景
在windows下用c++写代码难免要选择stl或atl的烦恼。特别是面对一些组织数据的常用方法类时。
本文则对 std::map,std::unordered_map,CAtlMap,CRBMap进行了无碰撞比较。而平时使用最多的也是这种情况。
测试过程
粗略测试,直接撸点代码看看时间就行。
int main()
{
{
std::map<std::string, int> stdmap;
for (size_t i = 0; i < 100 * 10000; i++)
{
char str[32] = { 0 };
sprintf_s(str, 32, "map_%d", i);
stdmap[str] = i;
}
for (size_t i = 0; i < 10 * 10000; i++)
{
char str[32] = { 0 };
sprintf_s(str, 32, "map_%d", i);
int a = stdmap[str];
}
}
{
std::unordered_map<std::string, int> stdmap;
for (size_t i = 0; i < 100 * 10000; i++)
{
char str[32] = { 0 };
sprintf_s(str, 32, "map_%d", i);
stdmap[str] = i;
}
for (size_t i = 0; i < 10 * 10000; i++)
{
char str[32] = { 0 };
sprintf_s(str, 32, "map_%d", i);
int a = stdmap[str];
}
}
{
CAtlMap<CStringA, int> stdmap;
for (size_t i = 0; i < 100 * 10000; i++)
{
char str[32] = { 0 };
sprintf_s(str, 32, "map_%d", i);
stdmap[str] = i;
}
for (size_t i = 0; i < 10 * 10000; i++)
{
char str[32] = { 0 };
sprintf_s(str, 32, "map_%d", i);
int a = stdmap[str];
}
}
{
CRBMap<CStringA, int> stdmap;
for (size_t i = 0; i < 100 * 10000; i++)
{
char str[32] = { 0 };
sprintf_s(str, 32, "map_%d", i);
stdmap.SetAt(str, i);
}
for (size_t i = 0; i < 10 * 10000; i++)
{
char str[32] = { 0 };
sprintf_s(str, 32, "map_%d", i);
auto a = stdmap.FindFirstKeyAfter(str);
}
}
return ;
}
结论
在一般情况下:
内存占用:std::map ≈ std::unordered_map =2.x *( CAtlMap ≈ CRBMap )
stl库内存占用约为ATL库的两倍多一些。
插入时间:CAtlMap < unordered_map< std::map ≈ CRBMap
红黑树插入时间最长,散列时stl库缩短一半,ATL仅为1/5
获取时间:CAtlMap < unordered_map< CRBMap< std::map
ALT散列最优,stl是其两倍,rb是其四倍,stl是其6倍
综合选择:CAtlMap 优于 unordered_map优于 CRBMap优于 std::map
补:
遍历速度图: