Типичный случай — приложению работающему с БД некоторые объекты нужны так часто, то их необходимо кэшировать в памяти. В этом случае их кладут в структуру данных типа хэш. Однако, бывают случаи, когда даже поиск в этом хэше становится узким местом приложения и решения из стандартных библиотек перестают устраивать по своей производительности.
Основной упор доклада будет не на конкретный алгоритм, а на та техниках дизайна быстрых алгоритмов — на что надо обращать внимание, как вообще подходить к решению подобных задач.
19. Выбираем алгоритм
• Д. Кнут
«Искусство программирования»
• Т. Кормен и др.
«Алгоритмы: построение и анализ»
• С. Скиена
«Алгоритмы. Руководство по
разработке»
20. Хеш-таблицы
Прямая
Открытая адресация
адресация
Линейное Двойное
исследование хеширование
21. Хеш-таблицы
И что работает быстрее?
Прямая А это зависит от
Открытая адресация
адресация
реализации и железа
Линейной Двойное
исследование хеширование
22. Что используют другие?
Время, нс на операцию
600
Прямая адресация
500 Открытая адресация
400
300
200
100
0
HashMap Guava high-scale-lib Trove Javolution HPPC
23. Память – это новый диск
http://www.flickr.com/photos/gudlyf/6687607947/lightbox/
30. Выберем алгоритм (1)
Линейное исследование Двойное хеширование
• Проще • Больше кода
• Доступ к соседним • В случае промаха прыгает
ячейкам в новое место
• Более чувствительно к • Требует две независимые
качеству хеш-функции хеш-функции
• High-scale-lib, HPPC • Trove
31. Выберем алгоритм (2)
Хеш-функция умножением Хеш-функция делением
• Быстрая • Медленней
• Работает с таблицами – Но память еще медленней!
размером 2K • Лучше всего работает с
• Требует выбора таблицами простого
магического числа- размера
множителя • Trove
High-scale-lib – не использует хеш-функцию
HPPC – использует MurmurHash3
32. Как их комбинировать?
Проще всего
Линейное
исследование
Двойное
хеширование
Хеш-функция Хеш-функция
умножением делением
37. Каждая деталь имеет значение
http://car-interior-supplies.carinteriorss.co.uk/detail/
38. А если набор часто используемых
id случаен?
Время, нс на операцию
800
700
600 529
500 463
400
300 253
200 162 125 158
81
100
0
39. Общий процесс
Формулировка Модель Готовые
задачи нагрузки решения
Структура Проверка и
Алгоритм
данных замеры*
* Повторить с начала по необходимости
40. Спасибо за внимание
Роман Елизаров
elizarov@devexperts.com
Специальная благодарность:
Денису Кисловскому
41. Хотите знать больше?
Все подробности, код и обсуждение:
http://elizarov.livejournal.com
Ваши комментарии важны для меня