我遇到了一个有趣的性能问题。
我在 Windows 上工作,在 Visual Studio 2015 中。
我有一个程序目前依赖于 Boost 的动态位集。当我将它编译为 32 位程序时,它运行良好且快速。但是当我将它编译为 64 位程序时,它的速度要慢得多。
分析后,以下功能分别从几乎没有时间到 69% 和 22%:
lower_bound
:
std::_Hash<std::_Umap_traits<VSet,int,std::_Uhash_compare<VSet,std::hash<VSet>,std::equal_to<VSet> >,std::allocator<std::pair<VSet const ,int> >,0> >::lower_bound
_Insert
:
std::_Hash<std::_Umap_traits<VSet,int,std::_Uhash_compare<VSet,std::hash<VSet>,std::equal_to<VSet> >,std::allocator<std::pair<VSet const ,int> >,0> >::_Insert<std::pair<VSet const ,int> & __ptr64,std::_List_unchecked_iterator<std::_List_val<std::_List_simple_types<std::pair<VSet const ,int> > > > >
两者都在include/xhash
Visual C++ 头库中定义。但是,我对动态位集持怀疑态度,因为它们是被散列的内容。
VSet
他们所指的类型是boost::dynamic_bitset
我写的一个浅包装器,其散列函数定义如下:
namespace std {
template <> struct hash<VSet>
{
size_t operator()(const VSet & S) const
{
return boost::hash_value(S.bitVec.m_bits);
}
};
}
几个有趣的细节:
- Linux 上的 Clang 不会发生相同的性能问题。我还不能在 Windows 上用 Clang 测试它。
- 据我所知,我对 x86 和 x64 使用相同的优化器设置。
我的问题:
是否存在使用64 位
unordered_map
或boost::dynamic_bitset
64 位的已知“陷阱”?特别是,因为动态位集正在做一些位旋转的东西。VS 中是否有特定的优化器设置,我应该对其进行调整以避免这种情况?
在编译 Boost 库以防止这种情况时,我可能需要做些不同的事情吗?