Презентация к докладу «Практические приёмы оптимизации .NET-приложений» с конференции dotnetconf (Челябинск, 19 апреля 2015) http://dotnetconf.ru/materialy/optimization
3. 3
Важные вопросы
• А точно нужно что-то оптимизировать?
• Насколько будем оптимизировать?
• Под что будем оптимизировать?
• Что именно будем оптимизировать?
4. 4
От идеи до запуска
Общая схема
• Idea → C#
• C# + Compiler → IL
• IL + BCL + 3rdParty → App
• App + CLR (GC,JIT) → ASM
• ASM + CPU → Magic
Конфигурация
• OS: Win, Linux, MacOS
• CLR: CLR2, CLR4, CoreCLR,
Mono
• GC: MS, Boehm, Sgen
• JIT: x86, x64, RyuJIT
• Compilation: JIT, NGen, MPGO,
.NET Native
• …
5. 5
Наука о бенчмарках
• Макробенчмарки и микробенчмарки
• Важно использовать хороший профайлер
• Для микрооптимизаций нужны микробенчмарки
• Java-мир: JMH (см. http://shipilev.net/)
• Запускаем бенчмарк правильно: Release without
debugging, холодный старт vs прогрев, статистики
и т.д.
• BenchmarkDotNet
• https://github.com/AndreyAkinshin/BenchmarkDotNet
• https://www.nuget.org/packages/BenchmarkDotNet/
6. 6
Начинаем оптимизацию
• Грамотно проектируем архитектуру
• Выбираем эффективные алгоритмы
• И правильные структуры данных
• Следим за использованием памяти
• GC & Memory traffic
• class vs struct, упаковки и распаковки
• Пулинг дорогих объектов
• И т.д.
7. 7
Знай BCL!
Operation List LinkedList SortedDictonary Dictionary
Insert O(n) O(1) O(log n) O(1)
Remove O(n) O(1) O(log n) O(1)
Lookup O(n) O(n) O(log n) O(1)
Get by index O(1) O(n) — —
Display sorted O(n * log n) O(n * log n) O(n) O(n * log n)
• Пример 1: коллекции
14. 14
Loop unrolling
Достоинства:
• Экономия на икрементах
• Экономия на branch prediction
• Улучшение ILP
• «Помощь» другим оптимизациям
Недостатки:
• Увеличивается размер кода
• Промахи в кеше команд
• Нагрузка на регистры
• «Вред» другим оптимизациям