Я сделал несколько сравнений неупорядоченного набора со строками 4–64 тыс. В моем словаре.
Я обнаружил, что std :: set и unordered_set имели примерно одинаковое время выполнения в моей ситуации, потому что вычисление hash_value занимало около 80% времени выполнения для неупорядоченного набора.
Это уменьшило экономию при поиске (используется boost :: hash_value для std :: string FWIW)
YMMV, и в общих случаях я бы сказал, что профиль и не будут обмануты теоретическим масштабированием, которое не учитывает архитектуру процессора и т. Д. Хеш-карта может работать медленнее из-за стоимости хэш-памяти и будет занимать больше памяти .
В моем случае я храню информацию в течение длительного времени и регулярно получаю обновления, которые не изменяют хэш information_id, но могут изменять другое содержимое.
Затем каждое обновление передается в мою функцию поиска, чтобы решить, нужно ли мне извещать об этом обновлении извне.
Список информационных_идей для уведомления находится в этом поиске и может изменяться независимо от информации.
Кэшируя хеш-код для information_id, он, вероятно, будет повторно использован 10 раз за время существования информации.
Мое изменение в две строки для кэширования хэша улучшило время выполнения unordered_set на> x8
Тестовый набор: тестируется в MSVC 2012, обновление 4
1M записей посмотрел 10 раз каждая против словаря 4k и 64k:
Все проверки, кроме 10, - промахи в 4К, 500 попаданий в 64К (больше aardvarks:))
набор: 1373 мс / 1938 мс
мультисеть: 1376 мс / 1913 мс
unordered_set начальные 64 КБ / коэффициент загрузки 0,5: 168 мс / 362 мс
unordered_set 4k / 1.0: 331 мс / 452 мс
c.f предварительный кеш
unordered_set 64k / 0,5: 1519 мс / 1881 мс
FWIW То же самое работает с MinGW 4.9.1 -O3
набор: 2003 мс / 2490 мс
мультисеть: 1978 мс / 2306 мс
unordered_set начальные 64 КБ / 0,5 коэффициент загрузки: 140 мс / 605 мс
unordered_set 4k / 1.0: 318 мс / 683 мс
c.f предварительный кеш
unordered_set 64k / 0,5: 1619 мс / 2455 мс