Оптимизации уровня
CPU
Андрей Акиньшин, JetBrains
Перед началом оптимизационных работ
• Понять, что есть проблема
• Определить метрики и поставить задачи
• Научиться измерять эти метрики
• Убедиться в корректности измерений
• Найти узкое место
• Подумать
О чём стоит подумать сначала
• Грамотное масштабирование
• Разумный параллелизм
• Хорошая архитектура
• Эффективные алгоритмы
• Правильные структуры данных
• Вдумчивое использование стандартных библиотек и
вашего любимого языка программирования
• Аккуратная работа с памятью
• I/O, Работа с сетью
• …
Пара слов про микробенчмарки
Задачка: ускорить код
Числа, которые нужно знать
CPU Cache
Последовательный доступ лучше непоследовательного
Задачка: ускорить код
Задачка: ускорить код (Улучшение №1)
Branch prediction
Ветвления могут стоить очень дорого
Задачка: ускорить код (Улучшение №1)
Задачка: ускорить код (Улучшение №2)
Физическое устройство CPU
True Sharing
False Sharing
Про что ещё стоит помнить?
• Out-of-order execution
• Reorder buffer in Sandy Bridge: 168, in Haswell: 192, in Skylake: 224
• Instruction Level Parallelism
• SIMD
Мораль
• Знать устройство компьютера — важно
• Отсутствие знаний может стать источником проблем
• Присутствие знаний может помочь сильно разогнать код
Андрей Акиньшин, JetBrains
http://aakinshin.net
https://github.com/AndreyAkinshin
https://twitter.com/andrey_akinshin
andrey.akinshin@gmail.com

Оптимизации уровня CPU, Андрей Акиньшин (JetBrains)