1

我遇到了一个有趣的性能问题。

我在 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/xhashVisual 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_mapboost::dynamic_bitset64 位的已知“陷阱”?特别是,因为动态位集正在做一些位旋转的东西。

  • VS 中是否有特定的优化器设置,我应该对其进行调整以避免这种情况?

  • 在编译 Boost 库以防止这种情况时,我可能需要做些不同的事情吗?

4

0 回答 0