У меня интересная проблема с производительностью.
Я работаю на 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);
}
};
}
Пара интересных деталей:
Известны ли «Gotchas» с использованием либо unordered_map
или же boost::dynamic_bitset
с 64-битным? В частности, поскольку динамический набор битов делает кое-что сложное.
Есть ли особые настройки оптимизатора в VS, которые я должен настроить, чтобы избежать этого?
Может ли быть что-то, что я должен сделать по-другому при компиляции библиотек Boost, чтобы предотвратить это?
Задача ещё не решена.
Других решений пока нет …