map&lt;“string”,...&gt;之间的性能差异并映射<int,..>?</int,..>

时间:2012-07-13 01:31:33

标签: c++ map

  

可能重复:
  Cost of using std::map with std::string keys vs int keys?

如果我有两段代码:

1#:

map<unsigned int, unsigned short> ConnectedIPs;

PLUGIN_EXPORT bool PLUGIN_CALL OnPlayerConnect(int playerid)
{
    PlayerLoopList.push_back(playerid);
    char szIP[32];
    GetPlayerIp(playerid,szIP);
    unsigned short explodeIP[4];
    sscanf(szIP, " %d[^.].%d[^.].%d[^.].%d", &explodeIP[0], &explodeIP[1], &explodeIP[2], &explodeIP[3]);
    g_PlayerIP[playerid] = (explodeIP[0] + (explodeIP[1] << 8) + (explodeIP[2] << 16) + (explodeIP[3] << 24));
    ConnectedIPs[g_PlayerIP[playerid]] += 1;
    if(ConnectedIPs[g_PlayerIP[playerid]] >= g_max_ip)
    {
        Report(playerid,CHECK_IPFLOOD);
    }
    return true;
}

2#:

map<char*, unsigned short> ConnectedIPs;//edited from char to char*

PLUGIN_EXPORT bool PLUGIN_CALL OnPlayerConnect(int playerid)
{
    PlayerLoopList.push_back(playerid);
    char szIP[32];
    GetPlayerIp(playerid,szIP);
    ConnectedIPs[szIP] += 1;
    if(ConnectedIPs[szIP] >= g_max_ip)
    {
        Report(playerid,CHECK_IPFLOOD);
    }
    return true;
}

2#会更快吗? 此代码用于计算一个ip连接的播放器数量。我想我做得对,或者我不是?

2 个答案:

答案 0 :(得分:10)

我假设您在第二种情况下意味着map<string, unsigned short>,否则它甚至不会编译。

两者都会根据键的比较触发地图中的 O(log n)查找。比较32位整数通常比比较字符串更快,因此第一种情况应该更快。

我不担心它,除非有分析数据显示这对性能有重大影响。如果你只在玩家连接时这样做,并且会话往往持续“足够长”,那么这可能是一个无关紧要的优化 - 即便如此,切换到unordered_map可能比改变类型更重要关键。

答案 1 :(得分:0)

最大的影响可能是std::string大小造成的。您的CPU缓存可以比long更多std::string s。

但是,我仍然会选择第二个选项。这将适用于IPv6。