41
ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных Роман Елизаров Devexperts http://elizarov.livejournal.com

ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

  • Upload
    kamal

  • View
    71

  • Download
    0

Embed Size (px)

DESCRIPTION

ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных. Роман Елизаров Devexperts http://elizarov.livejournal.com. Преждевременная оптимизация!. http://www.flickr.com/photos/lofink/4501610335/. http://odetocode.com/Blogs/scott/archive/2008/07/15/optimizing-linq-queries.aspx. Проблемы со скоростью ?. - PowerPoint PPT Presentation

Citation preview

Page 1: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

ПИШЕМ САМЫЙ БЫСТРЫЙхеш для кэширования данных

Роман ЕлизаровDevexperts

http://elizarov.livejournal.com

Page 2: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

http://www.flickr.com/photos/lofink/4501610335/http://odetocode.com/Blogs/scott/archive/2008/07/15/optimizing-linq-queries.aspx

Преждевременная оптимизация!

Page 3: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Проблемы со скоростью?

Вам точно надо их решать?

Какие?

Почему?Где?

Page 4: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Формулируем задачу

Четко. Кратко. Измеримо.

Page 5: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Пример задачи

1. Работаем с заявками

2. Их много, они нужны часто

3. Хотим их кэшировать в памяти

Page 6: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Моделируем нагрузку

http://www.vsemayki.ru/product/19329/woman/

Page 7: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Пример нагрузки

~1М заявок в кэше10М запросов getByIdГеометрическое распределение id

Page 8: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Что будем измерять?

Время Память

Page 9: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Избежим типичных ошибок

Помним• JIT компиляция и оптимизация кода• Сборка мусора

Page 10: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Так что будем измерять?

Среднее время одной итерации

Page 11: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Пишем код для замеров

Page 12: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Ищем готовые решения

http://gizmod.ru/2009/05/29/zweistil--universalnyj_velosiped_s_motorchikom/

Page 13: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Разные реализации хеш-таблиц

HashMap Guava high-scale-lib Trove Javolution HPPC0

100

200

300

400

500

600

216

459

143101

508

156

Время, нс на операцию

Page 14: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Не цифрами едиными! RTSL

http://www.cafepress.com/researchit.640209934

Page 15: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Что мешает скорости?

HashMap Guava high-scale-lib Trove Javolution HPPC0

100

200

300

400

500

600

Время, нс на операцию

Функционал Гарантии real-time

Thread-safety

Page 16: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Вечный конфликт

УниверсальностьСкорость

Page 17: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Дизайн своего решения

Производительность никогда не появляется случайно,

только по замыслу авторов.

Page 18: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Из чего складывается скорость?

Алгоритм и структуры

данныхРеализация Результат

Page 19: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Выбираем алгоритм

• Д. Кнут «Искусство программирования»

• Т. Кормен и др. «Алгоритмы: построение и анализ»

• С. Скиена«Алгоритмы. Руководство по разработке»

Page 20: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Хеш-таблицы

Прямая адресация Открытая адресация

Линейное исследование

Двойное хеширование

Page 21: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Хеш-таблицы

Прямая адресация Открытая адресация

Линейной исследование

Двойное хеширование

И что работает быстрее?А это зависит от

реализации и железа

Page 22: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Что используют другие?

HashMap Guava high-scale-lib Trove Javolution HPPC0

100

200

300

400

500

600

Время, нс на операцию

Прямая адресацияОткрытая адресация

Page 23: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Память – это новый диск

http://www.flickr.com/photos/gudlyf/6687607947/lightbox/

Page 24: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Меньше памяти занимает – быстрее работает*

* При прочих равных

Page 25: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Проверим …

HashMap Guava high-scale-lib Trove Javolution HPPC0

100

200

300

400

500

600

700

800

Занимая память x100 KB

Page 26: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Меньше памяти использует – быстрее работает*

* При прочих равных

Page 27: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Порядок оптимизации при дизайне

Занимаемая память

Используемая память

Другие детали

Page 28: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Выберем структуру данных

Открытая адресация – один массив

Page 29: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Оценим потребление памяти

HashMap Guava high-scale-lib Trove Javolution HPPC Fast0

100

200

300

400

500

600

700

800

Занимая память x100 KB

Page 30: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Выберем алгоритм (1)

Линейное исследование• Проще• Доступ к соседним

ячейкам• Более чувствительно к

качеству хеш-функции• High-scale-lib, HPPC

Двойное хеширование• Больше кода• В случае промаха прыгает

в новое место• Требует две независимые

хеш-функции• Trove

Page 31: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Выберем алгоритм (2)

Хеш-функция умножением• Быстрая• Работает с таблицами

размером 2K

• Требует выбора магического числа-множителя

Хеш-функция делением• Медленней

– Но память еще медленней!• Лучше всего работает с

таблицами простого размера

• Trove

High-scale-lib – не использует хеш-функциюHPPC – использует MurmurHash3

Page 32: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Как их комбинировать?

Линейное исследование

Проще всего

Двойное хеширование

Хеш-функция умножением

Хеш-функция делением

Page 33: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Напишем же!

Page 34: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Магия золотого сечения

215

Равномерно размазывает последовательные числа по таблице

Page 35: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Замерим скорость

HashMap Guava high-scale-lib Trove Javolution HPPC Fast0

100

200

300

400

500

600

700

800

216

459

143101

508

15683

Время, нс на операцию

Page 36: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Важно распределение вероятности доступа к разным

элементам

Наиболее часто используемые заявки (последние) имеют соседние id

Page 37: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Каждая деталь имеет значение

http://car-interior-supplies.carinteriorss.co.uk/detail/

Page 38: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

HashMap Guava high-scale-lib Trove Javolution HPPC Fast0

100

200

300

400

500

600

700

800

253

463

162125

529

15881

Время, нс на операцию

А если набор часто используемых id случаен?

Page 39: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Общий процесс

Формулировка задачи

Модель нагрузки

Готовые решения

Структура данных Алгоритм Проверка и

замеры*

* Повторить с начала по необходимости

Page 40: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Спасибо за внимание

Роман Елизаров [email protected]

Специальная благодарность:Денису Кисловскому

Page 41: ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных

Все подробности, код и обсуждение:http://elizarov.livejournal.com

Ваши комментарии важны для меня

Хотите знать больше?