Вопрос или проблема
std::unordered_map
слишком медленный для меня. Я хочу что-то быстрее! Какие библиотеки или независимые источники реализуют альтернативные, более быстрые хеш-таблицы с подобным (или лучшим) интерфейсом?
Требования:
- Свободное
- Бесплатное
- Некоторое тестирование, подтверждающее заявления об эффективности
- Неизменяемая пользовательская база
hopscotch
- Форма: Только заголовки
- Лицензия: MIT (Бесплатно и Свободно)
- Результаты производительности: здесь
- Git репозиторий: tessil/hopscotch-map
Hopscotch также довольно производителен. Я нашел его, когда искал что-то подобное, что использовал ранее в небольшом проекте, где он показал гораздо лучшую производительность по сравнению с std::unordered_map. Я не проводил тесты производительности в сравнении с другими конкурентами.
Библиотека только с заголовками доступна на GitHub по приведенной выше ссылке. Библиотека также предоставляет реализации других алгоритмов хеш-таблиц. Создатель утверждает, что она использует меньше памяти, чем Google’s dense_hash_map
, но имеет аналогичную производительность. Но, как видно из других постов здесь, новые реализации хеш-таблиц регулярно появляются. Согласно посту, который я читал, hopscotch должен быть быстрее, чем ska::flat_hash_map
. В любом случае, она намного быстрее, чем карты в std.
Если вы можете пожертвовать такими гарантиями, как стабильность ссылок, вы можете использовать
ska::flat_hash_map
от Мальте Скарупке
Основные характеристики:
- Открытая адресация
- Линейное пробирование
- Хеширование Робин Гуда
- Количество слотов – простое число (но предоставляется возможность использовать степени двойки)
- С верхним пределом на количество проб
Также есть обсуждение этого на YouTube, проведенное Мальте Скарупке на C++ Now 2018:
Вы можете сделать лучше, чем
std::unordered_map
: Новые улучшения производительности хеш-таблицы
и блог-посты на его личном блоге, где вы также можете найти изображение с тестами производительности ниже:
patchmap
- открытый исходный код
- бесплатная поддержка от меня
- обширные тесты производительности и разреженные модульные тесты
- почти идеально имитирует интерфейс
std::unordered_map
- открытая адресация с использованием линейного пробирования с псевдослучайным порядком (похожим на хеширование Робин Гуда)
У меня была похожая проблема, мне нужна была хеш-таблица, которая не только была бы быстрее, но и более эффективно использовала память, именно поэтому я создал patchmap. Наиболее актуальная статистика при оценке производительности хеш-таблицы – это соотношение затрат по времени и памяти. И время, и память – это дорогостоящие ресурсы, поэтому вы захотите их сохранить, но предпочитаемое соотношение может различаться.
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: ▩
Успешные поиски, вероятно, являются наиболее частой операцией, которую должна выполнять хеш-таблица, но вставка, удаление и неудачные поиски тесты производительности не меняют общую картину кардинально. Patchmap не самый быстрый. Самой быстрой хеш-таблицей будет та, что использует много памяти, быстрый и хороший хеш и простую открытую адресацию и схему пробирования, такую как линейное пробирование. Она также не самая эффективная по памяти, хотя псевдослучайный порядок может быть согласован с этим режимом, жертвуя скоростью. Тем не менее, она предлагает маленький продукт пространства и времени, сопоставимый с bytell, оба лишь незначительно лучше, чем absl::flat_hash_map.
Существовала страница с тестированием хеш-таблиц на incise.org.
Согласно этому, лучшая производительность – по скорости, а не по памяти – у Google’s Dense Hash Map: C++11 репозиторий, оригинальный репозиторий.
Примечание: Указанные репозитории называются “sparsehash”, но на самом деле содержат как разреженные, так и плотные хеш-таблицы, а также разреженные и плотные хеш-множества.
Ответ или решение
Высокопроизводительная реализация хэш-таблицы на C++
Если std::unordered_map
не удовлетворяет вашим требованиям по производительности, существует несколько альтернативных библиотек и реализаций хэш-таблиц, которые могут предоставить более высокую эффективность. Вот некоторые из них, удовлетворяющие вашим критериям:
1. Hopscotch Map
- Форма: Библиотека без заголовков.
- Лицензия: MIT (бесплатная и открытая).
- Результаты тестирования производительности: Здесь.
- Гитхаб: tessil/hopscotch-map.
Hopscotch Map
– это библиотека, которая показывает отличные результаты в производительности, превосходя std::unordered_map
. Она менее затратна по памяти по сравнению с dense_hash_map
от Google, при этом обладает схожей производительностью. Эта библиотека имеет множество реализаций других алгоритмов хэш-таблиц и является достаточно популярной.
2. ska::flat_hash_map
- Форма: Библиотека без заголовков.
- Лицензия: MIT.
- Результаты тестирования производительности: Доступны на личном блоге автора и включают целый ряд сравнительных графиков.
- Гитхаб: ska::flat_hash_map.
Эта реализация хэш-таблицы основана на открытом адресации и линейном пробировании, что позволяет достигать высокой производительности. В ней используются две техники – Robin-Hood хэширование и первичные числа слотов. ska::flat_hash_map
также получила положительные отзывы на нескольких конференциях, включая выступление ее автора на C++ Now 2018. Также доступны блоговые посты автора, в которых детально описана производительность.
3. Patchmap
- Форма: Библиотека без заголовков.
- Лицензия: GPL (бесплатная и открытая).
- Результаты тестирования производительности: Обширные тесты и сравнения результатов доступны на сайте проекта.
- Гитхаб: 1ykos/patchmap.
Patchmap
– это библиотека, созданная для того, чтобы обеспечить не только высокую производительность, но и эффективность использования памяти. Она использует линейное пробирование с псевдослучайным порядком, что позволяет достигать хороших результатов в производительности. Интерфейс patchmap
практически идентичен std::unordered_map
, что упрощает ее интеграцию.
4. Google Sparse and Dense Hash Map
- Форма: Библиотека с исходным кодом.
- Лицензия: Apache License 2.0.
- Результаты тестирования производительности: Доступны на сайте hash table shootout.
- Гитхаб: sparsehash/sparsehash.
Эти хэш-таблицы показывают отличные результаты в тестах по производительности, особенно в контексте плотности и скорости обращения. Несмотря на свою сложную структуру, их использование может быть оправдано в проекте, где время выполнения критично.
Эти предложения помогут вам выбрать хэш-таблицу, отвечающую вашим требованиям по производительности и эффективности. Большинство из перечисленных библиотек активно используются в сообществе и поддерживаются разработчиками, что способствует надежности их применения. Важно отметить, что производительность может варьироваться в зависимости от конкретных сценариев использования, поэтому всегда стоит проводить собственные тесты с вашей специфической нагрузкой.