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

Вопрос или проблема

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.

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


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

Оцените материал
Добавить комментарий

Капча загружается...