unordered_map для boost :: dynamic_bitset медленнее при компиляции с 64-битной версией

У меня интересная проблема с производительностью.

Я работаю на 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);
}
};
}

Пара интересных деталей:

  • Та же проблема с производительностью не возникает с Clang в Linux. Я еще не смог протестировать его с Clang на Windows.
  • Насколько я вижу, я использую те же настройки оптимизатора для x86 и x64.

Мой вопрос:

  • Известны ли «Gotchas» с использованием либо unordered_map или же boost::dynamic_bitset с 64-битным? В частности, поскольку динамический набор битов делает кое-что сложное.

  • Есть ли особые настройки оптимизатора в VS, которые я должен настроить, чтобы избежать этого?

  • Может ли быть что-то, что я должен сделать по-другому при компиляции библиотек Boost, чтобы предотвратить это?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …