【发布时间】: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