字符串与哈希作为映射键 - 性能

String versus hash as map key - performance

本文关键字:性能 映射 哈希作 字符串      更新时间:2023-10-16

目前正在为我的游戏引擎编写日志系统。

为了保持一切清晰,我必须为每个 Logger 对象命名。记录器对象存储在 LogManager 类中,该类跟踪每个记录器实例。Map 正在存储指向记录器实例的指针,因为键使用 std::string 来表示名称。

我正在开发实时3D引擎,因此减少延迟非常重要。所以我想到了第二种存储它的方法 - 使用快速哈希算法(例如 MurMur 哈希 3)并且只存储 64 位哈希而不是字符串。

现在,我的问题:使用哈希而不是字符串作为映射键值在运行时(在我的和全局情况下)的性能是否更好?

@Edit访问代码

    std::map<std::string, CLogger*> map1;
std::map<QWORD, CLogger*> map2;
// access :
CLogger * logger = map1["root"];
CLogger * logger = map2[getHashedString("root")];
//
QWORD getHashedString(const std::string string)
{
    QWORD val = 0;
    hash_x64_128(string.c_str(), string.length(), 1234, &val);
    return val;
}

上面使用的算法是MurMur Hash 3(https://code.google.com/p/smhasher/source/browse/branches/chandlerc_dev/MurmurHash3.cpp)

此致敬意。

绝对。但请确保生成的哈希代码是唯一的。性能提升还取决于您使用的地图实现。例如,stl::map使用搜索树来存储键。在这种情况下,您可以节省大量字符串比较。如果您使用stl::unordered_map则获得的收益更少,因为它已经使用了哈希值。但是,如果您做得巧妙,您仍然可以在哈希计算上节省一些运行时。

一件非常重要的事情:测量优化前后的运行时;)

你能提供一些访问地图的代码吗?

计算自己的哈希

和让访问器计算哈希之间的区别在于,通过使用自己的哈希,map的Hash参数可能成为恒等函数。