目前我的游戏引擎写日志系统。
为了保持清晰,我必须给出每个Logger对象的名称。记录器对象存储在LogManager类中,该类跟踪每个Logger实例。Map存储指向Logger实例的指针,就像key使用代表名称的std::string一样。
我正在开发实时3D引擎,所以减少延迟是非常重要的。所以我想出了第二种存储方法--使用快速哈希算法(用于ex )。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 (dev/MurmurHash3.cpp)
诚挚的问候。
发布于 2015-01-17 15:25:50
很确定的。但是,请确保生成的哈希代码是唯一的。性能的提高也取决于您正在使用的映射实现。例如,stl::map使用搜索树来存储密钥。在这种情况下,您可以保存大量的字符串比较。如果使用的是stl::unordered_map,则会获得更少的收益,因为它已经使用了哈希值。但是,如果您聪明地这样做,仍然可以在散列计算上保存一些运行时。
一件非常重要的事情:测量优化前后的运行时;)
发布于 2015-01-17 15:19:03
你能提供一些访问地图的代码吗?
计算您自己的散列和让访问器计算哈希之间的区别在于,可能通过使用您自己的散列,map的哈希参数将成为标识函数。
https://stackoverflow.com/questions/28000756
复制相似问题