google::dense_hash_map和std::tr1::unordered_map有何区别?

9
我正在为多个平台(Android、iOS,以及未来可能还会有某些游戏机)开发一款移动游戏。我正在考虑使用 tr1::unordered_map 或者 google::dense_hash_map 来从资源管理器中检索纹理(以便稍后使用OpenGL进行绑定)。通常情况下,这可能每秒发生很多次(每帧N次,我的游戏运行在大约60 fps)。
需要考虑以下因素:
  • 性能(内存和CPU方面)
  • 可移植性
欢迎提出任何想法或建议。

我很感兴趣,为什么你一定要用哈希表呢?虽然我不了解你使用的平台,但是对于你所描述的目的来说,这听起来有些奇怪。 - Rookie
纹理管理的这种做法并不罕见,Ogre3D也使用了类似的方法(http://www.ogre3d.org/docs/api/html/classOgre_1_1TextureManager.html)。 - Goles
2
无法对这个问题给出一个好的答案。也许根本不会有任何明显的差异。为什么不测量一下看看呢? - Richard Wolf
你为什么认为这是不可能的?我也想要一些经验...我可以在我的当前平台(iOS)中衡量可移植性,但还不能在Android上。我也很想了解一些关于可移植性问题的信息。我不认为这个问题是无法回答的(当然最好的猜测是受欢迎的)。 - Goles
感谢您让我注意到Google Sparsehash(哦,还有:对其进行分析)。 - sehe
3个回答


1

使用STL标准容器。它们具有可预测的行为,并且可以在STL算法/迭代器中无缝使用。此外,STL还提供了一些性能保证。

这也应该保证可移植性。大多数编译器都已经实现了新的标准。


0
在我开发的一个 C++ 项目中,我曾经疑惑过类似的问题:哪个更好,tr1:unordered_mapboost::unordered_map 还是 std::map?最终我决定在编译时声明一个可控的 typedef
#ifdef UnorderedMapBoost
typedef boost::unordered_map<cell_key, Cell> cell_map;
#else
#ifdef UnorderedMapTR1
typedef std::tr1::unordered_map<cell_key, Cell> cell_map;
#else
typedef std::map<cell_key, Cell>  cell_map;
#endif // #ifdef UnorderedMapTR1
#endif // #ifdef UnorderedMapBoost

我可以在编译时控制使用哪一个,并对其进行分析。在我的情况下,可移植性最终变得更加重要,因此我通常使用std::map


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接