использование boost :: unordered_map в качестве справочной таблицы кажется очень медленным

Я определил следующую таблицу поиска:

boost::unordered_map<std::string, STFRandomTreeFunctor*> functor_look_up_table;

идея состоит в том, чтобы использовать его для вызова функтора, однако, похоже, он работает очень медленно. Сначала я подумал, что из-за того, что функция, вызываемая функтором, может запускаться долго, я заменил код следующим образом (т.е. удалил вызов functor()):

my_function(){
while(...){
STFRandomFunctor* f = functor_look_up_table.at(some_string);
...<do some other stuff>
}
}

и он все еще работает медленно, удаление линии STFRandomFunctor* f = functor_look_up_table.at(some_string); ускоряет код безмерно. Использую ли я неправильную структуру данных для моей справочной таблицы здесь? Если так, что предпочтительнее?

0

Решение

Строки @aleguna являются идентификаторами для функций, некоторые примеры — «single_channel_subtract_abs», «multi_channel_random_add», «multi_channel_random_subtract_abs». Всего 5 ключей

Тогда вы не должны использовать ни строку, ни unordered_map:

// Function.hpp

enum FunctorName {
single_channel_subtract_abs,
multi_channel_random_add,
multi_channel_random_substract_abs,
...
};

STFRandomTreeFunctor const& get(FunctorName name);

// Function.cpp
static STFRandomTreeFunctor const Functors[] = {
...
};

STFRandomTreeFunctor const& get(FunctorName name) {
size_t const index = name;

assert(index < sizeof(Functors) && "Need to update Functors");

return Functors[index];
} // get

Вы можете бросить const& в get в целом, если STFRandomTreeFunctor это typedef для типа функции, а не полноценного функтора.

4

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

unordered_map очень быстро справляются с поиском, но если у вас есть хорошая функция хеширования, каждый раз, когда вы смотрите на карту, хеш-код вашего ключа будет вычисляться, поэтому, если вычисление хеша занимает много времени, то ваша производительность низкая, с другой стороны если hash Функция генерирует аналогичные hash значения могут все (или многие) элементы попадать в одну корзину, и тогда ваш поиск станет линейным, для первой части ваша строка должна быть действительно огромной, чтобы хэш по умолчанию boost займет много времени, но для второй части попробуйте изменить размер корзины и снова проверить производительность.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector