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
ПИШЕМ САМЫЙ БЫСТРЫЙхеш для кэширования данных
Роман Елизаров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
Преждевременная оптимизация!
Проблемы со скоростью?
Вам точно надо их решать?
Какие?
Почему?Где?
Формулируем задачу
Четко. Кратко. Измеримо.
Пример задачи
1. Работаем с заявками
2. Их много, они нужны часто
3. Хотим их кэшировать в памяти
Моделируем нагрузку
http://www.vsemayki.ru/product/19329/woman/
Пример нагрузки
~1М заявок в кэше10М запросов getByIdГеометрическое распределение id
Что будем измерять?
Время Память
Избежим типичных ошибок
Помним• JIT компиляция и оптимизация кода• Сборка мусора
Так что будем измерять?
Среднее время одной итерации
Пишем код для замеров
Ищем готовые решения
http://gizmod.ru/2009/05/29/zweistil--universalnyj_velosiped_s_motorchikom/
Разные реализации хеш-таблиц
HashMap Guava high-scale-lib Trove Javolution HPPC0
100
200
300
400
500
600
216
459
143101
508
156
Время, нс на операцию
Не цифрами едиными! RTSL
http://www.cafepress.com/researchit.640209934
Что мешает скорости?
HashMap Guava high-scale-lib Trove Javolution HPPC0
100
200
300
400
500
600
Время, нс на операцию
Функционал Гарантии real-time
Thread-safety
Вечный конфликт
УниверсальностьСкорость
Дизайн своего решения
Производительность никогда не появляется случайно,
только по замыслу авторов.
Из чего складывается скорость?
Алгоритм и структуры
данныхРеализация Результат
Выбираем алгоритм
• Д. Кнут «Искусство программирования»
• Т. Кормен и др. «Алгоритмы: построение и анализ»
• С. Скиена«Алгоритмы. Руководство по разработке»
Хеш-таблицы
Прямая адресация Открытая адресация
Линейное исследование
Двойное хеширование
Хеш-таблицы
Прямая адресация Открытая адресация
Линейной исследование
Двойное хеширование
И что работает быстрее?А это зависит от
реализации и железа
Что используют другие?
HashMap Guava high-scale-lib Trove Javolution HPPC0
100
200
300
400
500
600
Время, нс на операцию
Прямая адресацияОткрытая адресация
Память – это новый диск
http://www.flickr.com/photos/gudlyf/6687607947/lightbox/
Меньше памяти занимает – быстрее работает*
* При прочих равных
Проверим …
HashMap Guava high-scale-lib Trove Javolution HPPC0
100
200
300
400
500
600
700
800
Занимая память x100 KB
Меньше памяти использует – быстрее работает*
* При прочих равных
Порядок оптимизации при дизайне
Занимаемая память
Используемая память
Другие детали
Выберем структуру данных
Открытая адресация – один массив
Оценим потребление памяти
HashMap Guava high-scale-lib Trove Javolution HPPC Fast0
100
200
300
400
500
600
700
800
Занимая память x100 KB
Выберем алгоритм (1)
Линейное исследование• Проще• Доступ к соседним
ячейкам• Более чувствительно к
качеству хеш-функции• High-scale-lib, HPPC
Двойное хеширование• Больше кода• В случае промаха прыгает
в новое место• Требует две независимые
хеш-функции• Trove
Выберем алгоритм (2)
Хеш-функция умножением• Быстрая• Работает с таблицами
размером 2K
• Требует выбора магического числа-множителя
Хеш-функция делением• Медленней
– Но память еще медленней!• Лучше всего работает с
таблицами простого размера
• Trove
High-scale-lib – не использует хеш-функциюHPPC – использует MurmurHash3
Как их комбинировать?
Линейное исследование
Проще всего
Двойное хеширование
Хеш-функция умножением
Хеш-функция делением
Напишем же!
Магия золотого сечения
215
Равномерно размазывает последовательные числа по таблице
Замерим скорость
HashMap Guava high-scale-lib Trove Javolution HPPC Fast0
100
200
300
400
500
600
700
800
216
459
143101
508
15683
Время, нс на операцию
Важно распределение вероятности доступа к разным
элементам
Наиболее часто используемые заявки (последние) имеют соседние id
Каждая деталь имеет значение
http://car-interior-supplies.carinteriorss.co.uk/detail/
HashMap Guava high-scale-lib Trove Javolution HPPC Fast0
100
200
300
400
500
600
700
800
253
463
162125
529
15881
Время, нс на операцию
А если набор часто используемых id случаен?
Общий процесс
Формулировка задачи
Модель нагрузки
Готовые решения
Структура данных Алгоритм Проверка и
замеры*
* Повторить с начала по необходимости
Все подробности, код и обсуждение:http://elizarov.livejournal.com
Ваши комментарии важны для меня
Хотите знать больше?