Практические приёмы оптимизации .NET-приложений
Андрей АкиньшинЭнтерра
http://aakinshin.net
10-я конференция .NET разработчиков19 апреля 2015dotnetconf.ru
2
Мудрая мысль
Premature optimization is the root of all evil © Donald Ervin Knuth
3
Важные вопросы
• А точно нужно что-то оптимизировать?
• Насколько будем оптимизировать?
• Под что будем оптимизировать?• Что именно будем
оптимизировать?
4
От идеи до запускаОбщая схема
Idea → C#C# + Compiler → ILIL + BCL + 3rdParty → AppApp + CLR (GC,JIT) → ASMASM + CPU → Magic
Конфигурация
OS: Win, Linux, MacOSCLR: CLR2, CLR4, CoreCLR,
MonoGC: MS, Boehm, SgenJIT: x86, x64, RyuJITCompilation: JIT, NGen,
MPGO, .NET Native…
5
Наука о бенчмарках
• Макробенчмарки и микробенчмарки• Важно использовать хороший профайлер • Для микрооптимизаций нужны
микробенчмарки• Java-мир: JMH (см. http://shipilev.net/)• Запускаем бенчмарк правильно: Release
without debugging, холодный старт vs прогрев, статистики и т.д.
• BenchmarkDotNet• https://github.com/AndreyAkinshin/BenchmarkDotNet• https://www.nuget.org/packages/BenchmarkDotNet/
6
Начинаем оптимизацию
• Грамотно проектируем архитектуру• Выбираем эффективные алгоритмы• И правильные структуры данных• Следим за использованием памяти• GC & Memory traffic• class vs struct, упаковки и распаковки• Пулинг дорогих объектов• И т.д.
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: коллекции
8
Знай BCL!
• Пример 2: ленивые вычисления
9
Знай BCL!
• Пример 3: прекомпиляция регулярных выражений
10
Иногда приходится спускаться уровнем ниже
11
Array bound check elimination
12
Inlining
13
Inlining
Jit-x86
Jit-x64
14
Loop unrolling
Достоинства:• Экономия на икрементах• Экономия на branch prediction• Улучшение ILP• «Помощь» другим оптимизациямНедостатки:• Увеличивается размер кода• Промахи в кеше команд• Нагрузка на регистры• «Вред» другим оптимизациям
15
Loop unrolling
Jit-x86
Jit-x64
Зависит от:• Версия JIT• Архитектура процессора• Количество итераций• Фазы луны
RyuJIT
16
CPU Cache
17
CPU Cache
18
CPU CacheBinarySearch
CacheConsciousBinarySearch
19
Parallelism
• Threads and Tasks• TPL• SIMD• Instruction-level parallelism
20
TPLParallel.For
PLINQ
21
Instruction-level parallelism
22
Заключение
Задайте себе важный вопрос:
Вы точно хотите заниматься оптимизацией?