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

Preview:

Citation preview

Практические приёмы оптимизации .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

Заключение

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

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

23

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

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

andrey.akinshin@gmail.comhttp://aakinshin.net

Recommended