Реализация высокопроизводительной хеш-таблицы C++

std::unordered_mapслишком медленно для меня. Я хочу что-то быстрее! Какие библиотеки/автономные источники реализуют альтернативные, более быстрые хеш-карты с аналогичным (или более совершенным) интерфейсом?

Требования:

  • бесплатно
  • Бесплатно
  • Какое-то тестирование, подтверждающее заявления об эффективности
  • Незначительная пользовательская база

Ответы (4)

классики

  • Форма: только заголовок
  • Лицензия: MIT (бесплатно и бесплатно)
  • Результаты тестов производительности: здесь
  • Git-репозиторий: tessil/hopscotch-map

Классики также весьма эффективны. Я нашел его, когда искал что-то похожее, которое я когда-то использовал в небольшом проекте, где он имел гораздо лучшую производительность, чем std::unordered_map. Я не проводил тестов производительности по сравнению с другими конкурентами.

Библиотека только для заголовков доступна на GitHub по ссылке выше. Библиотека также предоставляет реализации других алгоритмов отображения хэшей. Создатель утверждает, что он использует меньше памяти, чем Google, dense_hash_mapно имеет аналогичную производительность. Но, как вы можете видеть из других сообщений здесь, новые реализации хеш-карт появляются довольно постоянно. Согласно сообщению, которое я прочитал, классики должны быть быстрее, чем ska::flat_hash_map. В любом случае это намного быстрее, чем карты в std.

Можете ли вы описать, что в нем особенного? Кто его разработал? Какова мотивация/контекст его разработки? Почему это так называется?
добавил некоторые дополнительные детали, которые я мог быстро найти и вспомнить из его использования.

Если вы можете пожертвовать такими гарантиями, как эталонная стабильность, вы можете использовать

ska::flat_hash_mapМальте Скарупке

Основные особенности:


На YouTube также есть выступление Мальте Скарупке на C++ Now 2018:

Вы можете сделать лучше, чем std::unordered_map: Новые улучшения производительности хэш-таблицы

и сообщения в его личном блоге, где вы также можете найти контрольное изображение ниже:

введите описание изображения здесь

1. Пожалуйста, напишите пару предложений о том, что особенного в этой реализации хеш-карты, или каковы ее основные конструктивные особенности; ссылки хороши, но общая политика StackExchange заключается в том, чтобы основная информация содержалась в ответе. 2. По ссылке три разных шапки карты - как они связаны?
@einpoklum Я добавил в этот пост основные функции, перечисленные в блоге. Я не думаю, что можно резюмировать 1 час 30 минут разговора в нескольких предложениях. Важен только flat_hash_map.hppзаголовок, ссылку поменял.

На incise.org есть страница перестрелки хеш-таблиц .

В соответствии с этим наилучшая производительность — с точки зрения скорости, а не памяти — у Google Dense Hash Map: репозиторий C++11 , исходный репозиторий .

Примечание. Репозитории, на которые ссылаются, называются «sparsehash», но на самом деле содержат карты разреженных и плотных хэшей, а также наборы разреженных и плотных хэшей.

Тесту уже 8 лет — возможно, стоит пересмотреть цифры, используя текущий GCC.
В моих более поздних тестах это так же быстро или даже быстрее, чем ska::flat_hash_map и F14, и F14, и google плотности более эффективны с точки зрения памяти, чем ska::flat_hash_map: 1ykos.github.io/patchmap/#Performance%20comparison
@WolfgangBrehm: Что вы подразумеваете под «этим»? Я не упомянул в своем ответе «patchmap» ... возможно, вы могли бы написать отдельный ответ о своей работе?
@einpoklum Я думаю об этом, поэтому я здесь, но на самом деле это не самый быстрый ха-ха. Но я сделал тесты, которые сравнивают patchmap, google плотно, F14, ska::flat_hash_map и многое другое, которые вы можете найти, перейдя по ссылке. Самые быстрые хэш-таблицы имеют меньшее количество точек, самые эффективные по памяти находятся справа.
@WolfgangBrehm: это не обязательно должно быть самым быстрым. Вопрос о хеш-картах быстрее, чем std::unordered_map. Если это интересно, и кажется, что это заслуживает ответа и, возможно, плюса.
@einpoklum Спасибо, что побудили меня добавить рекомендацию, но то, что вы, вероятно, действительно хотите, это absl::flat_hash_map , самый быстрый с реальной пользовательской базой. Я должен сделать еще один пост для этого слишком?
@WolfgangBrehm Да. Хотя - вы уверены, что это не "переделка" старой плотной хеш-карты Google?

карта патчей

  • Открытый исходный код
  • безвозмездная поддержка от меня
  • обширные тесты производительности и разреженные модульные тесты
  • почти идеально имитирует интерфейсstd::unordered_map
  • открытая адресация с использованием линейного зондирования с псевдослучайным порядком (аналогично хешированию Робин-Гуда)

У меня была аналогичная проблема, мне нужна хеш-таблица, которая была бы не только быстрее, но и более эффективно использовала память, поэтому я создал карту патчей. Наиболее релевантной статистикой при оценке производительности хеш-таблицы является компромисс между пространством и временем. И время, и память являются дорогостоящими ресурсами, поэтому вы захотите их сэкономить, но предпочтительный компромисс может быть другим.производительность поиска и использование памяти различных хэш-таблиц

patchmap: 🔴                khash: × 
bytell: +                   google::sparse_hash_map: ○ 
google::dense_hash_map: ⬟   ska::flat_hash_map: △ 
std::unordered_map: ◇       sparsepp: ◻     
Judy array: ◆               F14ValueMap: ▲ 
chaining+sorting: •         robin_hood::unordered_map: ▽  
absl::flat_hash_map: ⬠      tsl::sparse_hash_map: ★ 
emilib2::HashMap: ▩ 

Успешный поиск, вероятно, является наиболее распространенной операцией, которую должна выполнять хэш-таблица, но вставка, удаление и неудачные тесты поиска не меняют кардинально картину. Патчмап не самый быстрый. Самой быстрой была бы хеш-таблица, использующая много памяти, быстрый и хороший хэш, а также простую открытую схему адресации и проверки, такую ​​как линейная проверка. Это также не самое эффективное использование памяти, хотя псевдослучайное упорядочение можно довести до этого режима, жертвуя скоростью. Однако он предлагает небольшой продукт пространства и времени, наравне с bytell , оба лишь незначительно лучше, чем absl::flat_hash_map .

Это довольно информативная таблица :-)