2

重複の可能性:
std::mapをstd::stringキーとintキーで使用するコストは?

2つのコードがある場合:

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#の方が速いでしょうか?このコードは、1つのIPから接続されているプレーヤーの数をカウントするためのものです。私はそれを正しくやっていると思いますか、そうではありませんか?

4

2 に答える 2

10

私はあなたmap<string, unsigned short>が2番目のケースを意図していると仮定しています、さもなければそれはコンパイルさえしません。

どちらも、キーの比較に基づいてマップ内でO(log n)ルックアップをトリガーします。一般に、32ビット整数の比較は文字列の比較よりも高速であるため、最初のケースの方が高速である必要があります。

ただし、これがパフォーマンスに大きな影響を与えることを示すプロファイリングデータがない限り、心配する必要はありません。プレーヤーが接続し、セッションが「十分に長く」続く傾向がある場合にのみこれを行う場合、これは重要でない最適化になる可能性があります。それでもunordered_map、キーのタイプを変更するよりも、に切り替える方が重要になる可能性があります。

于 2012-07-13T01:43:56.770 に答える
0

最大の影響はおそらくのサイズによって引き起こされstd::stringます。CPUキャッシュは、longsよりもはるかに多くのsに収まる可能性がありstd::stringます。

ただし、2番目のオプションを選択します。これはIPv6で機能します。

于 2012-07-13T08:12:25.533 に答える