Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Илья Ермошин «Оптимизация.NET приложений»

DotNetRu
December 19, 2019

Илья Ермошин «Оптимизация.NET приложений»

Описание: Не стоит заниматься оптимизацией ради оптимизации!. Но когда всё же приходит время ускорить наше приложение или уменьшить утилизацию ресурсов, то важно знать и понимать как устроен внутри наш любимый.NET? Какие отличия в версиях существуют? Какие технологии и когда следует использовать чтобы получить максимальный профит? Ну и как можно говорить про оптимизацию и при этом не вспомнить работу с коллекциями? Ответ на все эти и не только эти вопросы мы и постараемся дать под хорошим соусом из примеров и замеров в рамках доклада.

О спикере: Full-Stack разработчик компании ArtLogic, имею опыт разработки WPF/WCF/UWP/ASP.NET Core приложений. Опыт разработки более 8 лет. В данный момент занимаюсь разработкой логистической системы Pooling.me.

DotNetRu

December 19, 2019
Tweet

More Decks by DotNetRu

Other Decks in Programming

Transcript

  1. О себе Принимал участие в создание таких проектов как: •

    Кассовое ПО • Персональный гид сервис Must2Go.com • XENIO аналог steam • Криптобиржа gold.io • Работал над проектами компании Visa • Логистическая система Pooling.me • и др.
  2. Отличие платформ Framework • x32/x64/x86 • Support .NET 2/3/4.0 •

    NGen Core • x32/x64/x86/ARM • Support UNIX system • Faster than Framework/Mono
  3. Отличие платформ Framework • x32/x64/x86 • Support .NET 2/3/4.0 •

    NGen Core • x32/x64/x86/ARM • Support UNIX system • Faster than Framework/Mono • Minimum dependencies
  4. Отличие платформ Framework • x32/x64/x86 • Support .NET 2/3/4.0 •

    NGen Core • x32/x64/x86/ARM • Support UNIX system • Faster than Framework/Mono • Minimum dependencies • Compact *.csproj
  5. Отличие платформ Framework • x32/x64/x86 • Support .NET 2/3/4.0 •

    NGen Core • x32/x64/x86/ARM • Support UNIX system • Faster than Framework/Mono • Minimum dependencies • Compact *.csproj • R2R
  6. Что такое оптимизация? • Процесс максимизации выгодных характеристик, соотношений (например,

    оптимизация производственных процессов и производства), и минимизации расходов.
  7. Что такое оптимизация? • Процесс максимизации выгодных характеристик, соотношений (например,

    оптимизация производственных процессов и производства), и минимизации расходов. • Изменение какого-либо функционала, ради уменьшения затрат во время выполнения данного действия.
  8. Использование правильных технологий для конкретных задач Входные данные*: t=20181125T142800&s=850.12&fn=8715000100011785&i=86841&fp=1440325305&n=1 Паттерн:

    ^t=(?<Date>[0-9-:A-Z]+)&s=(?<Sum>[0-9]+(?:\.[0-9]{2})?)&fn=[0-9]+&i=[0-9]+&fp=[0- 9]+&n=1$ 1) (?<Date>[0-9-:A-Z]+) Верни мне дату с чека в отдельной группе “Date” 2) (?<Sum>[0-9]+(?:\.[0-9]{2})?) Верни мне сумму с чека в отдельной группе “Sum”
  9. Использование правильных технологий для конкретных задач Входные данные*: t=20181125T142800&s=850.12&fn=8715000100011785&i=86841&fp=1440325305&n=1 Паттерн:

    ^t=(?<Date>[0-9-:A-Z]+)&s=(?<Sum>[0-9]+(?:\.[0-9]{2})?)&fn=[0-9]+&i=[0-9]+&fp=[0-9]+&n=1$ 1) (?<Date>[0-9-:A-Z]+) Верни мне дату с чека в отдельной группе “Date” 2) (?<Sum>[0-9]+(?:\.[0-9]{2})?) Верни мне сумму с чека в отдельной группе “Sum” Полный результат: * Date: 20181125T142800 Sum: 850.12
  10. Optimization Regex • Чем меньше группировок, тем быстрее скорость выполнения.

    • (<Test>[a-zA-Z])->(?:[a-zA-Z]) • Если вы часто используете регулярные выражения, создайте его один раз глобально. • public static Regex pattern = …
  11. Optimization Regex • Чем меньше группировок, тем быстрее скорость выполнения.

    • (<Test>[a-zA-Z])->(?:[a-zA-Z]) • Если вы часто используете регулярные выражения, создайте его один раз глобально. • public static Regex pattern = … • Компилируйте регулярное выражение только в том случае, если уверены, что это ускорить работу вашего куска кода. • new Regex(pattern, RegexOptions.Compiled);
  12. Optimization Regex • Чем меньше группировок, тем быстрее скорость выполнения.

    • (<Test>[a-zA-Z])->(?:[a-zA-Z]) • Если вы часто используете регулярные выражения, создайте его один раз глобально. • public static Regex pattern = … • Компилируйте регулярное выражение только в том случае, если уверены, что это ускорить работу вашего куска кода. • new Regex(pattern, RegexOptions.Compiled); • Старайтесь уменьшить количество экранирования (\), данный функционал замедляет скорость выполнения. • [0-9]\\\+\*
  13. Работа с коллекциями • Array – Массив данный с заранее

    известным количеством элементов.
  14. Работа с коллекциями • Array – Массив данный с заранее

    известным количеством элементов. • List – Аналог массива с возможностью динамически изменять размер коллекции.
  15. Работа с коллекциями • Array – Массив данный с заранее

    известным количеством элементов. • List – Аналог массива с возможностью динамически изменять размер коллекции. • HashSet – Коллекция ключей и значений с хэш-коду ключа.
  16. Работа с коллекциями • Array – Массив данный с заранее

    известным количеством элементов. • List – Аналог массива с возможностью динамически изменять размер коллекции. • HashSet – Коллекция ключей и значений с хэш-коду ключа. • Dictionary – Коллекция ключей и значений.
  17. Работа с коллекциями • Array – Массив данный с заранее

    известным количеством элементов. • List – Аналог массива с возможностью динамически изменять размер коллекции. • HashSet – Коллекция ключей и значений с хэш-коду ключа. • Dictionary – Коллекция ключей и значений. • ReadOnlyList – Список, который можно лишь прочитать по индексу.
  18. Collections Method Time Memory ToArray 4150 ns (7864 ns) 2463

    bytes (4500 bytes) ToList 5789 ns (9875 ns) 2371 bytes (4431 bytes) Elements 500 (1000)
  19. Cycles Method Array List For (10000) 63 us (66 us)

    111 us (160 us) For (End) (10000) 63 us (60 us) 68 us (148 us) Foreach (10000) 43 us (40 us) 211 us (266 us) For (100000) 6,566 us (6,148 us) 11,049 us (15,987 us) For (End) (100000) 7,108 us (7,042 us) 7,702 us (16,724 us) Foreach (100000) 6,107 us (4,474 us) 21,241 us (28,732 us) *Core 3.1 (Framework 4.8)
  20. LINQ DbContext.Get<Order>() .Where(x=>!x.IsDeleted) .Where(x=> x.Cost > 250) .Select(x=> x.Id) .ToList();

    1. Убираем материализацию данных в начале
  21. LINQ DbContext.Get<Order>() .Where(x=> !x.IsDeleted && x.Cost > 250) .Select(x=> x.Id)

    .ToList(); 1. Убираем материализацию данных в начале 2. Убираем двойной вызов условия Where
  22. LINQ DbContext.Get<Order>() .Where(x=> !x.IsDeleted && x.Cost > 250) .Select(x=> x.Id)

    .ToArray(); 1. Убираем материализацию данных в начале 2. Убираем двойной вызов условия Where 3. Меняем материализацию данных на массив
  23. LINQ DbContext.Get<Order>() .Where(x=> !x.IsDeleted && x.Cost > 250) .Select(x=> x.Id)

    .ToArrayAsync(); 1. Убираем материализацию данных в начале 2. Убираем двойной вызов условия Where 3. Меняем материализацию данных на массив 4. Выполняем функцию асинхронно
  24. LINQ (Before) DbContext.Get<Order>() .ToList() .Where(x=>!x.IsDeleted) .Where(x=> x.Cost > 250) .Select(x=>

    x.Id) .ToList(); (After) DbContext.Get<Order>() .Where(x=> !x.IsDeleted && x.Cost > 250) .Select(x=> x.Id) .ToArrayAsync();
  25. Optimization LINQ • Мы составляем оптимальный query, по скорости и

    памяти. • Уменьшаем время вызова LINQ путём убираем лишних операций.
  26. Optimization LINQ • Мы составляем оптимальный query, по скорости и

    памяти. • Уменьшаем время вызова LINQ путём убираем лишних операций. • И вызываем операцию асинхронно, что уменьшить задержки.
  27. Optimization LINQ IEnumerable<Table> items = DbContext<Table>().ToList(); items = items.Where(x=> x.IsActive);

    items = items.Where(x=> p1 == x.p1); items = items.Where(x=> p2 == x.p2); items = items.Where(x=> p3 == x.p3); items = items.Where(x=> p4 == x.p4); var result = items.OrderBy() .ThenBy() … return result;
  28. Optimization LINQ var items = DbContext<Table>().Where(x=> x.IsActive && p1 ==

    x.p1 && p2 == x.p2 && p3 == x.p3 && p4 == x.p4) .OrderBy() .ThenBy()… .ToArrayAsync(); return items;
  29. Optimization LINQ var items = DbContext<Table>().AsNoTracking().Where(x=> x.IsActive && p1 ==

    x.p1 && p2 == x.p2 && p3 == x.p3 && p4 == x.p4) .OrderBy() .ThenBy()… .ToArrayAsync(); return items; * EF Core
  30. Tier Compilation • Многоуровневая компиляция ускоряет время запуска вашего решения,

    но вы жертвуете тем, что части вашего кода будут компилироваться в более оптимизированную версию в фоне, что может привести к небольшим накладным расходам. • С приходом NET Core 3.0 уменьшилось время сборки проектов с включенным tier compilation и пофиксили баги связанные с этой технологий.
  31. AOT Ngen • AOT in Framework • Требует первой сборки

    приложения на клиентской машине R2R
  32. AOT Ngen • AOT in Framework • Требует первой сборки

    приложения на клиентской машине R2R • AOT in Core • Собирает машинный код при сборке проекта • Собирает ваше приложение в один файл.
  33. AOT Ngen • AOT in Framework. • Требует первой сборки

    приложения на клиентской машине. R2R • AOT in Core. • Собирает машинный код при сборке проекта. • Собирает ваше приложение в один файл.