【问题标题】:String versus hash as map key - performance字符串与哈希作为映射键 - 性能
【发布时间】:2015-03-16 01:11:03
【问题描述】:

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

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

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

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

@编辑访问代码

    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)

最好的问候。

【问题讨论】:

  • 您是否描述过访问这些记录器有问题?或者您是否分析了哈希与字符串?
  • @Borgleader 我做了干测试,超过 1 000 000 000 次迭代,访问时间的差异约为 70 秒,但我仍然不知道在这种情况下使用哈希是一种好习惯。是的,我只分析了哈希与字符串。

标签: c++ string dictionary hash


【解决方案1】:

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

非常重要的一点:在优化前后测量运行时间;)

【讨论】:

    【解决方案2】:

    您能否提供一些访问地图的代码?

    计算自己的哈希和让访问者计算哈希的区别在于,也许通过使用自己的哈希,map的哈希参数变成了身份函数。

    【讨论】:

    • 您好,感谢您的回答,我在帖子下方添加了完整的访问代码。
    • 鉴于代码我敢说它使用了一个简单的哈希函数(给定一个已经是数字的键),而且在新方案下你可能没有冲突。如果您不需要对地图进行排序,则无序地图是更好的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    相关资源
    最近更新 更多