23
Практические приёмы оптимизации .NET-приложений Андрей Акиньшин Энтерра http://aakinshin.net 10-я конференция .NET разработчиков 19 апреля 2015 dotnetconf.ru

Практические приёмы оптимизации .NET-приложений

Embed Size (px)

Citation preview

Page 1: Практические приёмы оптимизации .NET-приложений

Практические приёмы оптимизации .NET-приложений

Андрей АкиньшинЭнтерра

http://aakinshin.net

10-я конференция .NET разработчиков19 апреля 2015dotnetconf.ru

Page 2: Практические приёмы оптимизации .NET-приложений

2

Мудрая мысль

Premature optimization is the root of all evil © Donald Ervin Knuth

Page 3: Практические приёмы оптимизации .NET-приложений

3

Важные вопросы

• А точно нужно что-то оптимизировать?

• Насколько будем оптимизировать?

• Под что будем оптимизировать?• Что именно будем

оптимизировать?

Page 4: Практические приёмы оптимизации .NET-приложений

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…

Page 5: Практические приёмы оптимизации .NET-приложений

5

Наука о бенчмарках

• Макробенчмарки и микробенчмарки• Важно использовать хороший профайлер • Для микрооптимизаций нужны

микробенчмарки• Java-мир: JMH (см. http://shipilev.net/)• Запускаем бенчмарк правильно: Release

without debugging, холодный старт vs прогрев, статистики и т.д.

• BenchmarkDotNet• https://github.com/AndreyAkinshin/BenchmarkDotNet• https://www.nuget.org/packages/BenchmarkDotNet/

Page 6: Практические приёмы оптимизации .NET-приложений

6

Начинаем оптимизацию

• Грамотно проектируем архитектуру• Выбираем эффективные алгоритмы• И правильные структуры данных• Следим за использованием памяти• GC & Memory traffic• class vs struct, упаковки и распаковки• Пулинг дорогих объектов• И т.д.

Page 7: Практические приёмы оптимизации .NET-приложений

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: коллекции

Page 8: Практические приёмы оптимизации .NET-приложений

8

Знай BCL!

• Пример 2: ленивые вычисления

Page 9: Практические приёмы оптимизации .NET-приложений

9

Знай BCL!

• Пример 3: прекомпиляция регулярных выражений

Page 10: Практические приёмы оптимизации .NET-приложений

10

Иногда приходится спускаться уровнем ниже

Page 11: Практические приёмы оптимизации .NET-приложений

11

Array bound check elimination

Page 12: Практические приёмы оптимизации .NET-приложений

12

Inlining

Page 13: Практические приёмы оптимизации .NET-приложений

13

Inlining

Jit-x86

Jit-x64

Page 14: Практические приёмы оптимизации .NET-приложений

14

Loop unrolling

Достоинства:• Экономия на икрементах• Экономия на branch prediction• Улучшение ILP• «Помощь» другим оптимизациямНедостатки:• Увеличивается размер кода• Промахи в кеше команд• Нагрузка на регистры• «Вред» другим оптимизациям

Page 15: Практические приёмы оптимизации .NET-приложений

15

Loop unrolling

Jit-x86

Jit-x64

Зависит от:• Версия JIT• Архитектура процессора• Количество итераций• Фазы луны

RyuJIT

Page 16: Практические приёмы оптимизации .NET-приложений

16

CPU Cache

Page 17: Практические приёмы оптимизации .NET-приложений

17

CPU Cache

Page 18: Практические приёмы оптимизации .NET-приложений

18

CPU CacheBinarySearch

CacheConsciousBinarySearch

Page 19: Практические приёмы оптимизации .NET-приложений

19

Parallelism

• Threads and Tasks• TPL• SIMD• Instruction-level parallelism

Page 20: Практические приёмы оптимизации .NET-приложений

20

TPLParallel.For

PLINQ

Page 21: Практические приёмы оптимизации .NET-приложений

21

Instruction-level parallelism

Page 22: Практические приёмы оптимизации .NET-приложений

22

Заключение

Задайте себе важный вопрос:

Вы точно хотите заниматься оптимизацией?

Page 23: Практические приёмы оптимизации .NET-приложений

23

Спасибо за внимание

Андрей АкиньшинЭнтерра

[email protected]://aakinshin.net