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

凯珀·法拉特(KacperFałat)

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

为了使所有内容保持清楚,我必须为每个Logger对象指定名称。记录器对象存储在LogManager类中,该类可跟踪每个Logger实例。Map正在存储指向Logger实例的指针,因为键使用表示名称的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哈希3(https://code.google.com/p/smhasher/source/browse/branches/chandlerc_dev/MurmurHash3.cpp

最好的祝福。

加伯·安加尔(GáborAngyal)

肯定地。但是,请确保生成的哈希码是唯一的。性能提升还取决于您使用的地图实现。例如,stl::map使用搜索树来存储关键字。在这种情况下,您可以节省很多字符串比较。如果您正在使用stl::unordered_map,则收益会减少,因为它已经使用了哈希值。但是,如果您巧妙地执行操作,仍可以在哈希计算上节省一些运行时。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

Java / Scala中的高性能字符串哈希函数

来自分类Dev

哈希数组映射的Trie性能

来自分类Dev

我的函数从字典中删除键的性能,这些键是其他键的子字符串

来自分类Dev

性能char vs字符串

来自分类Dev

字符串匹配性能:gcc与CPython

来自分类Dev

Java中的字符串构建性能

来自分类Dev

字符串IdentityHashMap与HashMap性能

来自分类Dev

python中的字符串替换性能

来自分类Dev

提高VBA字符串比较的性能

来自分类Dev

字典<字符串,字符串>值查找性能

来自分类Dev

哈希联接性能起源

来自分类Dev

哈希联接性能起源

来自分类Dev

字典中的长字符串键会导致性能问题吗?

来自分类Dev

字典中的长字符串键会导致性能问题吗?

来自分类Dev

反向映射收集的性能

来自分类Dev

逆字典映射的性能

来自分类Dev

多线程:映射性能

来自分类Dev

字典枚举键性能

来自分类Dev

键与值的性能

来自分类Dev

键与值的性能

来自分类Dev

字符串值作为哈希键,已创建副本

来自分类Dev

使用字符串或符号作为键创建哈希

来自分类Dev

Perl-使用RegExp字符串作为哈希键

来自分类Dev

在Elastic Search中使用长度为100个字符的字符串作为_Id列的性能影响

来自分类Dev

Java字符串:私有静态性能与局部变量性能

来自分类Dev

在HashSet <string>性能中搜索字符串

来自分类Dev

Swift数组和字符串性能缓慢

来自分类Dev

将字符串转换为可执行代码的性能