410 likes | 596 Views
ПИШЕМ САМЫЙ БЫСТРЫЙ хеш для кэширования данных. Роман Елизаров 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. Проблемы со скоростью ?.
E N D
ПИШЕМ САМЫЙ БЫСТРЫЙхеш для кэширования данных Роман Елизаров 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/
Не цифрами едиными! RTSL http://www.cafepress.com/researchit.640209934
Что мешает скорости? Гарантии real-time Функционал Thread-safety
Дизайн своего решения Производительность никогда не появляется случайно,только по замыслу авторов.
Выбираем алгоритм • Д. Кнут «Искусство программирования» • Т. Кормен и др. «Алгоритмы: построение и анализ» • С. Скиена«Алгоритмы. Руководство по разработке»
И что работает быстрее? А это зависит от реализации и железа
Память – это новый диск http://www.flickr.com/photos/gudlyf/6687607947/lightbox/
Меньше памяти занимает – быстрее работает* * При прочих равных
Меньше памяти использует – быстрее работает* * При прочих равных
Выберем структуру данных Открытая адресация – один массив
Выберем алгоритм (1) Линейное исследование Двойное хеширование Больше кода В случае промаха прыгает в новое место Требует две независимые хеш-функции Trove • Проще • Доступ к соседним ячейкам • Более чувствительно к качеству хеш-функции • High-scale-lib, HPPC
Выберем алгоритм (2) Хеш-функция умножением Хеш-функция делением Медленней Но память еще медленней! Лучше всего работает с таблицами простого размера Trove • Быстрая • Работает с таблицами размером 2K • Требует выбора магического числа-множителя High-scale-lib – не использует хеш-функцию HPPC – использует MurmurHash3
Магия золотого сечения Равномерно размазывает последовательные числа по таблице
Важно распределение вероятности доступа к разным элементам Наиболее часто используемые заявки (последние) имеют соседние id
Каждая деталь имеет значение http://car-interior-supplies.carinteriorss.co.uk/detail/
А если набор часто используемых id случаен?
Общий процесс * Повторить с начала по необходимости
Спасибо за внимание • РоманЕлизаров • elizarov@devexperts.com • Специальная благодарность: • Денису Кисловскому
Хотите знать больше? Все подробности, код и обсуждение: http://elizarov.livejournal.com Ваши комментарии важны для меня