SlideShare a Scribd company logo
1 of 29
Download to read offline
1.NET Meetup 2017
SEP 30 2017
Основы профилирования
и оптимизации .NET
приложений
2.NET Meetup 2017
Ключевые темы
• Что такое профилирование
• Утечка памяти
• Оптимизация памяти
• Производительность
• Взаимные блокировки
3.NET Meetup 2017
Часть 1:
Что такое профилирование
4.NET Meetup 2017
Что такое отладчик
• “Debug” сборка приложения
• Прерывание выполнения программы
• Пошаговое выполнение приложения
• Изменения хода выполнения программы
• Влияние на выполнение программы
Отладчик
Отладка – этап разработки программы, на котором проверяется корректность
работы программы.
5.NET Meetup 2017
Что такое профилирование
• “Release” сборка приложения
• Работа программы не прерывается
• Сбор количественных данных во время выполнения
• Минимальное влияние на выполнение программы
Профайлер
Профилирование – процесс сбора количественных характеристик,
во время работы программы.
6.NET Meetup 2017
Профилирование производительности:
• Информация методе
• Время выполнения метода
Профилирование памяти:
• Количество объектов созданных в теле метода
• Тип объектов которые создаются
Получение результатов:
• ETW Events
• .NET Remoting
Как это работает
7.NET Meetup 2017
Часть 2:
Утечки памяти
8.NET Meetup 2017
УТЕЧКА ПАМЯТИ
Действия:
• Шаг 1: Выделение объектов, память
которых не освобождается
• Шаг 2: Выделение участков кода, в
которых создаются объекты, память
которых не освобождается
• Шаг 3: Внесение изменений и
повторный запуск теста
• Шаг 4: Сравнение результатов, если
результат не достигнут, переходим
на Шаг 1
Профилирование памяти
Выявление функционала для профилирования, подготовка и запуск теста
Ключевые параметры:
• Количество выделенной памяти
• Количество освобожденной памяти
• Количество созданных объектов по типам
• Количество памяти занимаемое каждым типом объектов
9.NET Meetup 2017
Шаг №1: Выделение памяти
• Количество выделенной памяти
• Количество освобожденной памяти
10.NET Meetup 2017
Шаг №1: Типы созданных объектов
• Количество созданных
объектов по типам
11.NET Meetup 2017
Шаг №1: Количество созданных объектов
• Точка создания объектов
• Количество памяти занимаемое
каждым типом объектов
12.NET Meetup 2017
Часть 3:
Потребление памяти
13.NET Meetup 2017
ОПТИМИЗАЦИЯ ПАМЯТИ
Действия:
• Шаг 1:Выделение объектов которые
активней всего используют
оперативную память
• Шаг 2:Выделение участков кода, в
которых создаются объекты.
• Шаг 3:Внесение изменений и
повторный запуск кода
• Шаг 4: Сравнение результатов, если
результат не достигнут переходим
на Шаг 1
Профилирование памяти
Выявление функционала для профилирования, подготовка и запуск теста
Ключевые параметры:
• Количество выделенной памяти
• Количество освобожденной памяти
• Количество созданных объектов по типам
• Количество памяти занимаемое каждым типом объектов
14.NET Meetup 2017
Легкий уровень сложности:
• Изменение стратегии работы GC
• Определение избыточного набора данных, поиск случаев когда
можно обойтись ограниченным набором данных
• Использование Cache которые расположены не в оперативной памяти
Средний уровень сложности:
• Искусственное ограничение, времени жизни объекта
• Принудительное удаление объекта, не дожидаясь когда сработает GC
Тяжелый уровень сложности:
• Оптимизация размера данных
• Компрессия/декомпрессия данных
• Использование нескольких процессов, для реализации
распределенного in memory cache, для случая x86 платформы
Оптимизация памяти
15.NET Meetup 2017
Часть 4:
Производительность
16.NET Meetup 2017
Профилирование производительности
Ключевые параметры:
• Общее время выполнения функции
• Количество вызовов функции
• Потоки в которых вызываются функции
Направление: Оптимизируйте функции, которые вызываются наибольшее количество
раз.
17.NET Meetup 2017
Профилирование производительности: Потоки
Потоки в которых вызываются функции
18.NET Meetup 2017
Легкий уровень сложности:
• Оптимизация ввода/вывода
• Выбор оптимального алгоритма
• Пакетная обработка данных
• Параллельная обработка
Средний уровень сложности:
• Оптимизация блокировок, за счет более точного разделения множеств данных
• Отложенное освобождение памяти, выделение памяти заранее
• Отказ от использования динамических конструкций
• Использование массивов
• Использование struct вместо class
• Использование цикла for
• Отказ от использования volatile
• Отказ от использования ThreadPool
Тяжелый уровень сложности:
• Векторизация кода (SSE, AVX)
• Unsafe код
• Inline методы
• Выравнивание данных
• Lock-free алгоритмы и структуры данных
Оптимизации производительности
19.NET Meetup 2017
Часть 5:
Взаимные блокировки
20.NET Meetup 2017
Ключевые параметры:
• Общее время выполнения функции
• Количество вызовов функции
Направление: Поиск функций время выполнения которых, сильно изменяется после
возникновения блокировки.
Действия:
• Шаг 1: Поиск функций, с наибольшим изменением времени.
• Шаг 2: Анализ времени жизни потоков
• Шаг 3: Внесение изменений в код
• Шаг 4: Повторный запуск теста
• Шаг 5: Сравнение результатов тестов.
Поиск взаимных блокировок
Шаг Процесс 1 Процесс 2
1 Хочет захватить A и B, начинает с A Хочет захватить A и B, начинает с B
2 Захватывает ресурс A Захватывает ресурс B
3 Ожидает освобождения ресурса B Ожидает освобождения ресурса A
4 Взаимная блокировка
21.NET Meetup 2017
Без блокировкиШаг №1: Методы
Без блокировки
22.NET Meetup 2017
С блокировкойШаг №1: Методы
С блокировкой
23.NET Meetup 2017
Шаг №2: ПотокиШаг №2: Потоки
Без блокировки
24.NET Meetup 2017
Шаг №2: Потоки
Шаг №2: Потоки
С блокировкой
25.NET Meetup 2017
Ремарка: Хорошим тоном является, не вызывать блокировки
из кода который стоит под блокировкой.
Легкий уровень сложности:
• Область применения блокировки, должна быть минимальной.
Средний уровень сложности:
• Разделение блокировок за счет разбиения кода на две функции до блокировки и
после блокировки. Есть вероятность создания Livelock.
Тяжелый уровень сложности:
• Применение изменений к объектам через копии.
Оптимизация блокировок
26.NET Meetup 2017
Livelock – зацикливание ожидания блокировок.
Система, продолжает работу, ее состояние постоянно меняется
за счет ожидания цикличного ожидания освобождения блокировки.
Направление: Построение графа блокировок.
Оптимизация блокировок
27.NET Meetup 2017
В завершении
40%
• Определение целей
• Выбор архитектуры которая наилучшим образом позволяет
достигать целей
Архитектура
30%
• Хранение данных
• Доступ к данным
• Представление данных
Данные
20%
• Алгоритм, который позволяет достигать целей
• Подготовка данных
• Работа с результатом
Алгоритмы
10%
• Оптимизация производительности
• Оптимизация памяти
• Накладные расходы, при параллельной обработке
Оптимизация
кода
Решения из которых складывается производительность:
28.NET Meetup 2017
Спасибо!
Вопросы?
29.NET Meetup 2017
Контакты:
mail: AlexandrSaitov@gmail.com
skype: LeonInc
Всем спасибо за участие и до новых встреч!

More Related Content

What's hot

Дмитрий Долгов
Дмитрий ДолговДмитрий Долгов
Дмитрий ДолговCodeFest
 
Testing with Selenium
Testing with SeleniumTesting with Selenium
Testing with SeleniumOSLL
 
Денис Противенский, Percona — Percona Server for MongoDB: обзор возможностей
Денис Противенский, Percona — Percona Server for MongoDB: обзор возможностейДенис Противенский, Percona — Percona Server for MongoDB: обзор возможностей
Денис Противенский, Percona — Percona Server for MongoDB: обзор возможностейDev_Party
 
Разработка надежных параллельных, распределенных приложений: быстро и дешево
Разработка надежных параллельных, распределенных приложений: быстро и дешевоРазработка надежных параллельных, распределенных приложений: быстро и дешево
Разработка надежных параллельных, распределенных приложений: быстро и дешевоDotNetConf
 
Микросервисы на практике
Микросервисы на практикеМикросервисы на практике
Микросервисы на практикеVitebsk DSC
 
Девять проектов в параллель. Живинка в деле (SQA Days)
Девять проектов в параллель. Живинка в деле (SQA Days)Девять проектов в параллель. Живинка в деле (SQA Days)
Девять проектов в параллель. Живинка в деле (SQA Days)2ГИС Технологии
 
Обзор Linux Control Groups
Обзор Linux Control GroupsОбзор Linux Control Groups
Обзор Linux Control GroupsOSLL
 
Синхронный MODX: как сделать настоящую синхронизацию и не застрелиться
Синхронный MODX: как сделать настоящую синхронизацию и не застрелитьсяСинхронный MODX: как сделать настоящую синхронизацию и не застрелиться
Синхронный MODX: как сделать настоящую синхронизацию и не застрелитьсяMODX Беларусь
 
Micro orm для жизни. Кожевников Дмитрий D2D Just.NET
Micro orm для жизни. Кожевников Дмитрий D2D Just.NETMicro orm для жизни. Кожевников Дмитрий D2D Just.NET
Micro orm для жизни. Кожевников Дмитрий D2D Just.NETDev2Dev
 
Как это будет: ASP.NET Core
Как это будет: ASP.NET CoreКак это будет: ASP.NET Core
Как это будет: ASP.NET CoreDotNetConf
 
Python Development process in Yandex
Python Development process in YandexPython Development process in Yandex
Python Development process in Yandexaviatakz
 
Как размножается Sphinx
Как размножается SphinxКак размножается Sphinx
Как размножается SphinxAlexander Byndyu
 
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)Ontico
 
Тестовая инфраструктура в облаке
Тестовая инфраструктура в облакеТестовая инфраструктура в облаке
Тестовая инфраструктура в облакеSQALab
 
Архитектура программных систем на Node.js
Архитектура программных систем на Node.jsАрхитектура программных систем на Node.js
Архитектура программных систем на Node.jsTimur Shemsedinov
 
Дмитрий Дегтярев, "Хабикаса"
Дмитрий Дегтярев, "Хабикаса"Дмитрий Дегтярев, "Хабикаса"
Дмитрий Дегтярев, "Хабикаса"Ontico
 
Автоматизация нагрузочного тестирования в связке JMeter + TeamСity + Grafana ...
Автоматизация нагрузочного тестирования в связке JMeter + TeamСity + Grafana ...Автоматизация нагрузочного тестирования в связке JMeter + TeamСity + Grafana ...
Автоматизация нагрузочного тестирования в связке JMeter + TeamСity + Grafana ...Positive Hack Days
 
Как мы данные готовили ORM и все-все-все в приложении Почта Mail.Ru / Кирилл ...
Как мы данные готовили ORM и все-все-все в приложении Почта Mail.Ru / Кирилл ...Как мы данные готовили ORM и все-все-все в приложении Почта Mail.Ru / Кирилл ...
Как мы данные готовили ORM и все-все-все в приложении Почта Mail.Ru / Кирилл ...Ontico
 
Пространства имен Linux (linux namespaces)
Пространства имен Linux (linux namespaces)Пространства имен Linux (linux namespaces)
Пространства имен Linux (linux namespaces)OSLL
 

What's hot (20)

Дмитрий Долгов
Дмитрий ДолговДмитрий Долгов
Дмитрий Долгов
 
Testing with Selenium
Testing with SeleniumTesting with Selenium
Testing with Selenium
 
Денис Противенский, Percona — Percona Server for MongoDB: обзор возможностей
Денис Противенский, Percona — Percona Server for MongoDB: обзор возможностейДенис Противенский, Percona — Percona Server for MongoDB: обзор возможностей
Денис Противенский, Percona — Percona Server for MongoDB: обзор возможностей
 
Разработка надежных параллельных, распределенных приложений: быстро и дешево
Разработка надежных параллельных, распределенных приложений: быстро и дешевоРазработка надежных параллельных, распределенных приложений: быстро и дешево
Разработка надежных параллельных, распределенных приложений: быстро и дешево
 
Микросервисы на практике
Микросервисы на практикеМикросервисы на практике
Микросервисы на практике
 
Девять проектов в параллель. Живинка в деле (SQA Days)
Девять проектов в параллель. Живинка в деле (SQA Days)Девять проектов в параллель. Живинка в деле (SQA Days)
Девять проектов в параллель. Живинка в деле (SQA Days)
 
Обзор Linux Control Groups
Обзор Linux Control GroupsОбзор Linux Control Groups
Обзор Linux Control Groups
 
Dapper + QueryObject
Dapper + QueryObjectDapper + QueryObject
Dapper + QueryObject
 
Синхронный MODX: как сделать настоящую синхронизацию и не застрелиться
Синхронный MODX: как сделать настоящую синхронизацию и не застрелитьсяСинхронный MODX: как сделать настоящую синхронизацию и не застрелиться
Синхронный MODX: как сделать настоящую синхронизацию и не застрелиться
 
Micro orm для жизни. Кожевников Дмитрий D2D Just.NET
Micro orm для жизни. Кожевников Дмитрий D2D Just.NETMicro orm для жизни. Кожевников Дмитрий D2D Just.NET
Micro orm для жизни. Кожевников Дмитрий D2D Just.NET
 
Как это будет: ASP.NET Core
Как это будет: ASP.NET CoreКак это будет: ASP.NET Core
Как это будет: ASP.NET Core
 
Python Development process in Yandex
Python Development process in YandexPython Development process in Yandex
Python Development process in Yandex
 
Как размножается Sphinx
Как размножается SphinxКак размножается Sphinx
Как размножается Sphinx
 
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
 
Тестовая инфраструктура в облаке
Тестовая инфраструктура в облакеТестовая инфраструктура в облаке
Тестовая инфраструктура в облаке
 
Архитектура программных систем на Node.js
Архитектура программных систем на Node.jsАрхитектура программных систем на Node.js
Архитектура программных систем на Node.js
 
Дмитрий Дегтярев, "Хабикаса"
Дмитрий Дегтярев, "Хабикаса"Дмитрий Дегтярев, "Хабикаса"
Дмитрий Дегтярев, "Хабикаса"
 
Автоматизация нагрузочного тестирования в связке JMeter + TeamСity + Grafana ...
Автоматизация нагрузочного тестирования в связке JMeter + TeamСity + Grafana ...Автоматизация нагрузочного тестирования в связке JMeter + TeamСity + Grafana ...
Автоматизация нагрузочного тестирования в связке JMeter + TeamСity + Grafana ...
 
Как мы данные готовили ORM и все-все-все в приложении Почта Mail.Ru / Кирилл ...
Как мы данные готовили ORM и все-все-все в приложении Почта Mail.Ru / Кирилл ...Как мы данные готовили ORM и все-все-все в приложении Почта Mail.Ru / Кирилл ...
Как мы данные готовили ORM и все-все-все в приложении Почта Mail.Ru / Кирилл ...
 
Пространства имен Linux (linux namespaces)
Пространства имен Linux (linux namespaces)Пространства имен Linux (linux namespaces)
Пространства имен Linux (linux namespaces)
 

Similar to Александр Саитов «Основы профилирования и оптимизации приложений в .NET»

Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaAlex Chistyakov
 
РИФ 2016, Внедрение контроля качества в большом web-проекте на примере Badoo
РИФ 2016, Внедрение контроля качества в большом web-проекте на примере BadooРИФ 2016, Внедрение контроля качества в большом web-проекте на примере Badoo
РИФ 2016, Внедрение контроля качества в большом web-проекте на примере BadooТарасов Константин
 
ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production
ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с ProductionThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production
ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с ProductionVladimir Malinin
 
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...HappyDev
 
Построение системы аналитики
Построение системы аналитикиПостроение системы аналитики
Построение системы аналитикиИлья Середа
 
Test driven development in net
Test driven development in netTest driven development in net
Test driven development in netAlex Tumanoff
 
Лучшие практики на практике
Лучшие практики на практикеЛучшие практики на практике
Лучшие практики на практикеDenis Tuchin
 
Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server ...
Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server ...Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server ...
Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server ...Stas Vyschepan
 
Производительность и надежность Docsvision 5
Производительность и надежность Docsvision 5Производительность и надежность Docsvision 5
Производительность и надежность Docsvision 5Docsvision
 
Улучшить KPI в два раза? Сделано!
Улучшить KPI в два раза? Сделано!Улучшить KPI в два раза? Сделано!
Улучшить KPI в два раза? Сделано!SQALab
 
«трудности при разработке сложных распределённых систем на Java. способы реше...
«трудности при разработке сложных распределённых систем на Java. способы реше...«трудности при разработке сложных распределённых систем на Java. способы реше...
«трудности при разработке сложных распределённых систем на Java. способы реше...MDDay_4
 
Микросервисный фронтенд
Микросервисный фронтендМикросервисный фронтенд
Микросервисный фронтендViacheslav Slinko
 
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)Ontico
 
Monitoring driven эксплуатация / Николай Сивко (HeadHunter)
Monitoring driven эксплуатация / Николай Сивко (HeadHunter)Monitoring driven эксплуатация / Николай Сивко (HeadHunter)
Monitoring driven эксплуатация / Николай Сивко (HeadHunter)Ontico
 
Monitoring-driven эксплуатация (rootconf2015)
Monitoring-driven эксплуатация (rootconf2015)Monitoring-driven эксплуатация (rootconf2015)
Monitoring-driven эксплуатация (rootconf2015)Nikolay Sivko
 
И снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоИ снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоStanfy
 
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...Badoo Development
 
Test Driven Development in .NET Applications
Test Driven Development in .NET ApplicationsTest Driven Development in .NET Applications
Test Driven Development in .NET ApplicationsAnton Vidishchev
 
Распространенные ошибки применения баз данных
Распространенные ошибки применения баз данныхРаспространенные ошибки применения баз данных
Распространенные ошибки применения баз данныхSergey Xek
 

Similar to Александр Саитов «Основы профилирования и оптимизации приложений в .NET» (20)

Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на Java
 
РИФ 2016, Внедрение контроля качества в большом web-проекте на примере Badoo
РИФ 2016, Внедрение контроля качества в большом web-проекте на примере BadooРИФ 2016, Внедрение контроля качества в большом web-проекте на примере Badoo
РИФ 2016, Внедрение контроля качества в большом web-проекте на примере Badoo
 
ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production
ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с ProductionThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production
ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production
 
Sivko
SivkoSivko
Sivko
 
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...
 
Построение системы аналитики
Построение системы аналитикиПостроение системы аналитики
Построение системы аналитики
 
Test driven development in net
Test driven development in netTest driven development in net
Test driven development in net
 
Лучшие практики на практике
Лучшие практики на практикеЛучшие практики на практике
Лучшие практики на практике
 
Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server ...
Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server ...Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server ...
Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server ...
 
Производительность и надежность Docsvision 5
Производительность и надежность Docsvision 5Производительность и надежность Docsvision 5
Производительность и надежность Docsvision 5
 
Улучшить KPI в два раза? Сделано!
Улучшить KPI в два раза? Сделано!Улучшить KPI в два раза? Сделано!
Улучшить KPI в два раза? Сделано!
 
«трудности при разработке сложных распределённых систем на Java. способы реше...
«трудности при разработке сложных распределённых систем на Java. способы реше...«трудности при разработке сложных распределённых систем на Java. способы реше...
«трудности при разработке сложных распределённых систем на Java. способы реше...
 
Микросервисный фронтенд
Микросервисный фронтендМикросервисный фронтенд
Микросервисный фронтенд
 
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
 
Monitoring driven эксплуатация / Николай Сивко (HeadHunter)
Monitoring driven эксплуатация / Николай Сивко (HeadHunter)Monitoring driven эксплуатация / Николай Сивко (HeadHunter)
Monitoring driven эксплуатация / Николай Сивко (HeadHunter)
 
Monitoring-driven эксплуатация (rootconf2015)
Monitoring-driven эксплуатация (rootconf2015)Monitoring-driven эксплуатация (rootconf2015)
Monitoring-driven эксплуатация (rootconf2015)
 
И снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоИ снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел Тайкало
 
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...
Доклад Сергея Аверина на DevConf 2013. "Распространенные ошибки применения ба...
 
Test Driven Development in .NET Applications
Test Driven Development in .NET ApplicationsTest Driven Development in .NET Applications
Test Driven Development in .NET Applications
 
Распространенные ошибки применения баз данных
Распространенные ошибки применения баз данныхРаспространенные ошибки применения баз данных
Распространенные ошибки применения баз данных
 

More from SpbDotNet Community

Станислав Флусов «Sharing общих сборок между процессами и доменами в IIS»
Станислав Флусов «Sharing общих сборок между процессами и доменами в IIS»Станислав Флусов «Sharing общих сборок между процессами и доменами в IIS»
Станислав Флусов «Sharing общих сборок между процессами и доменами в IIS»SpbDotNet Community
 
Егор Гришечко «У вас найдётся минутка, чтобы поговорить о блокчейне?»
Егор Гришечко «У вас найдётся минутка, чтобы поговорить о блокчейне?»Егор Гришечко «У вас найдётся минутка, чтобы поговорить о блокчейне?»
Егор Гришечко «У вас найдётся минутка, чтобы поговорить о блокчейне?»SpbDotNet Community
 
Константин Васильев «Fody против рутины»
Константин Васильев «Fody против рутины»Константин Васильев «Fody против рутины»
Константин Васильев «Fody против рутины»SpbDotNet Community
 
Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...
Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...
Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...SpbDotNet Community
 
Слава Бобик «NancyFx для самых маленьких»
Слава Бобик «NancyFx для самых маленьких»Слава Бобик «NancyFx для самых маленьких»
Слава Бобик «NancyFx для самых маленьких»SpbDotNet Community
 
Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»
Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»
Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»SpbDotNet Community
 
Игорь Лабутин «Коллекционируем данные в .NET»
Игорь Лабутин «Коллекционируем данные в .NET»Игорь Лабутин «Коллекционируем данные в .NET»
Игорь Лабутин «Коллекционируем данные в .NET»SpbDotNet Community
 
Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»
Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»
Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»SpbDotNet Community
 
Артём Акуляков - F# for Data Analysis
Артём Акуляков - F# for Data AnalysisАртём Акуляков - F# for Data Analysis
Артём Акуляков - F# for Data AnalysisSpbDotNet Community
 
Анатолий Кулаков «The Metrix has you…»
Анатолий Кулаков «The Metrix has you…»Анатолий Кулаков «The Metrix has you…»
Анатолий Кулаков «The Metrix has you…»SpbDotNet Community
 
Роман Неволин «Провайдеры типов без боли и магии»
Роман Неволин «Провайдеры типов без боли и магии»Роман Неволин «Провайдеры типов без боли и магии»
Роман Неволин «Провайдеры типов без боли и магии»SpbDotNet Community
 
Дмитрий Верескун «Синтаксический сахар C#»
Дмитрий Верескун «Синтаксический сахар C#»Дмитрий Верескун «Синтаксический сахар C#»
Дмитрий Верескун «Синтаксический сахар C#»SpbDotNet Community
 
Сергей Лёвкин «Технологии Microsoft для актуальных трендов»
Сергей Лёвкин «Технологии Microsoft для актуальных трендов»Сергей Лёвкин «Технологии Microsoft для актуальных трендов»
Сергей Лёвкин «Технологии Microsoft для актуальных трендов»SpbDotNet Community
 
Алексей Мерсон «Domain Driven Design: профит малой кровью»
Алексей Мерсон «Domain Driven Design: профит малой кровью»Алексей Мерсон «Domain Driven Design: профит малой кровью»
Алексей Мерсон «Domain Driven Design: профит малой кровью»SpbDotNet Community
 
Егор Гришечко «Async/Await и всё, что вы боялись спросить»
Егор Гришечко «Async/Await и всё, что вы боялись спросить»Егор Гришечко «Async/Await и всё, что вы боялись спросить»
Егор Гришечко «Async/Await и всё, что вы боялись спросить»SpbDotNet Community
 
Михаил Щербаков «Что может быть проще: делегаты и события»
Михаил Щербаков «Что может быть проще: делегаты и события»Михаил Щербаков «Что может быть проще: делегаты и события»
Михаил Щербаков «Что может быть проще: делегаты и события»SpbDotNet Community
 
Никита Каменский «Есть ли жизнь с UWP?»
Никита Каменский «Есть ли жизнь с UWP?»Никита Каменский «Есть ли жизнь с UWP?»
Никита Каменский «Есть ли жизнь с UWP?»SpbDotNet Community
 
Александр Кугушев «Roslyn: очевидные неочевидности»
Александр Кугушев «Roslyn: очевидные неочевидности»Александр Кугушев «Roslyn: очевидные неочевидности»
Александр Кугушев «Roslyn: очевидные неочевидности»SpbDotNet Community
 
ДотаНетоЛогия: СПб 2017
ДотаНетоЛогия: СПб 2017ДотаНетоЛогия: СПб 2017
ДотаНетоЛогия: СПб 2017SpbDotNet Community
 
Юрий Волков «VM via F#»
Юрий Волков «VM via F#»Юрий Волков «VM via F#»
Юрий Волков «VM via F#»SpbDotNet Community
 

More from SpbDotNet Community (20)

Станислав Флусов «Sharing общих сборок между процессами и доменами в IIS»
Станислав Флусов «Sharing общих сборок между процессами и доменами в IIS»Станислав Флусов «Sharing общих сборок между процессами и доменами в IIS»
Станислав Флусов «Sharing общих сборок между процессами и доменами в IIS»
 
Егор Гришечко «У вас найдётся минутка, чтобы поговорить о блокчейне?»
Егор Гришечко «У вас найдётся минутка, чтобы поговорить о блокчейне?»Егор Гришечко «У вас найдётся минутка, чтобы поговорить о блокчейне?»
Егор Гришечко «У вас найдётся минутка, чтобы поговорить о блокчейне?»
 
Константин Васильев «Fody против рутины»
Константин Васильев «Fody против рутины»Константин Васильев «Fody против рутины»
Константин Васильев «Fody против рутины»
 
Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...
Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...
Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...
 
Слава Бобик «NancyFx для самых маленьких»
Слава Бобик «NancyFx для самых маленьких»Слава Бобик «NancyFx для самых маленьких»
Слава Бобик «NancyFx для самых маленьких»
 
Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»
Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»
Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»
 
Игорь Лабутин «Коллекционируем данные в .NET»
Игорь Лабутин «Коллекционируем данные в .NET»Игорь Лабутин «Коллекционируем данные в .NET»
Игорь Лабутин «Коллекционируем данные в .NET»
 
Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»
Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»
Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»
 
Артём Акуляков - F# for Data Analysis
Артём Акуляков - F# for Data AnalysisАртём Акуляков - F# for Data Analysis
Артём Акуляков - F# for Data Analysis
 
Анатолий Кулаков «The Metrix has you…»
Анатолий Кулаков «The Metrix has you…»Анатолий Кулаков «The Metrix has you…»
Анатолий Кулаков «The Metrix has you…»
 
Роман Неволин «Провайдеры типов без боли и магии»
Роман Неволин «Провайдеры типов без боли и магии»Роман Неволин «Провайдеры типов без боли и магии»
Роман Неволин «Провайдеры типов без боли и магии»
 
Дмитрий Верескун «Синтаксический сахар C#»
Дмитрий Верескун «Синтаксический сахар C#»Дмитрий Верескун «Синтаксический сахар C#»
Дмитрий Верескун «Синтаксический сахар C#»
 
Сергей Лёвкин «Технологии Microsoft для актуальных трендов»
Сергей Лёвкин «Технологии Microsoft для актуальных трендов»Сергей Лёвкин «Технологии Microsoft для актуальных трендов»
Сергей Лёвкин «Технологии Microsoft для актуальных трендов»
 
Алексей Мерсон «Domain Driven Design: профит малой кровью»
Алексей Мерсон «Domain Driven Design: профит малой кровью»Алексей Мерсон «Domain Driven Design: профит малой кровью»
Алексей Мерсон «Domain Driven Design: профит малой кровью»
 
Егор Гришечко «Async/Await и всё, что вы боялись спросить»
Егор Гришечко «Async/Await и всё, что вы боялись спросить»Егор Гришечко «Async/Await и всё, что вы боялись спросить»
Егор Гришечко «Async/Await и всё, что вы боялись спросить»
 
Михаил Щербаков «Что может быть проще: делегаты и события»
Михаил Щербаков «Что может быть проще: делегаты и события»Михаил Щербаков «Что может быть проще: делегаты и события»
Михаил Щербаков «Что может быть проще: делегаты и события»
 
Никита Каменский «Есть ли жизнь с UWP?»
Никита Каменский «Есть ли жизнь с UWP?»Никита Каменский «Есть ли жизнь с UWP?»
Никита Каменский «Есть ли жизнь с UWP?»
 
Александр Кугушев «Roslyn: очевидные неочевидности»
Александр Кугушев «Roslyn: очевидные неочевидности»Александр Кугушев «Roslyn: очевидные неочевидности»
Александр Кугушев «Roslyn: очевидные неочевидности»
 
ДотаНетоЛогия: СПб 2017
ДотаНетоЛогия: СПб 2017ДотаНетоЛогия: СПб 2017
ДотаНетоЛогия: СПб 2017
 
Юрий Волков «VM via F#»
Юрий Волков «VM via F#»Юрий Волков «VM via F#»
Юрий Волков «VM via F#»
 

Александр Саитов «Основы профилирования и оптимизации приложений в .NET»

  • 1. 1.NET Meetup 2017 SEP 30 2017 Основы профилирования и оптимизации .NET приложений
  • 2. 2.NET Meetup 2017 Ключевые темы • Что такое профилирование • Утечка памяти • Оптимизация памяти • Производительность • Взаимные блокировки
  • 3. 3.NET Meetup 2017 Часть 1: Что такое профилирование
  • 4. 4.NET Meetup 2017 Что такое отладчик • “Debug” сборка приложения • Прерывание выполнения программы • Пошаговое выполнение приложения • Изменения хода выполнения программы • Влияние на выполнение программы Отладчик Отладка – этап разработки программы, на котором проверяется корректность работы программы.
  • 5. 5.NET Meetup 2017 Что такое профилирование • “Release” сборка приложения • Работа программы не прерывается • Сбор количественных данных во время выполнения • Минимальное влияние на выполнение программы Профайлер Профилирование – процесс сбора количественных характеристик, во время работы программы.
  • 6. 6.NET Meetup 2017 Профилирование производительности: • Информация методе • Время выполнения метода Профилирование памяти: • Количество объектов созданных в теле метода • Тип объектов которые создаются Получение результатов: • ETW Events • .NET Remoting Как это работает
  • 7. 7.NET Meetup 2017 Часть 2: Утечки памяти
  • 8. 8.NET Meetup 2017 УТЕЧКА ПАМЯТИ Действия: • Шаг 1: Выделение объектов, память которых не освобождается • Шаг 2: Выделение участков кода, в которых создаются объекты, память которых не освобождается • Шаг 3: Внесение изменений и повторный запуск теста • Шаг 4: Сравнение результатов, если результат не достигнут, переходим на Шаг 1 Профилирование памяти Выявление функционала для профилирования, подготовка и запуск теста Ключевые параметры: • Количество выделенной памяти • Количество освобожденной памяти • Количество созданных объектов по типам • Количество памяти занимаемое каждым типом объектов
  • 9. 9.NET Meetup 2017 Шаг №1: Выделение памяти • Количество выделенной памяти • Количество освобожденной памяти
  • 10. 10.NET Meetup 2017 Шаг №1: Типы созданных объектов • Количество созданных объектов по типам
  • 11. 11.NET Meetup 2017 Шаг №1: Количество созданных объектов • Точка создания объектов • Количество памяти занимаемое каждым типом объектов
  • 12. 12.NET Meetup 2017 Часть 3: Потребление памяти
  • 13. 13.NET Meetup 2017 ОПТИМИЗАЦИЯ ПАМЯТИ Действия: • Шаг 1:Выделение объектов которые активней всего используют оперативную память • Шаг 2:Выделение участков кода, в которых создаются объекты. • Шаг 3:Внесение изменений и повторный запуск кода • Шаг 4: Сравнение результатов, если результат не достигнут переходим на Шаг 1 Профилирование памяти Выявление функционала для профилирования, подготовка и запуск теста Ключевые параметры: • Количество выделенной памяти • Количество освобожденной памяти • Количество созданных объектов по типам • Количество памяти занимаемое каждым типом объектов
  • 14. 14.NET Meetup 2017 Легкий уровень сложности: • Изменение стратегии работы GC • Определение избыточного набора данных, поиск случаев когда можно обойтись ограниченным набором данных • Использование Cache которые расположены не в оперативной памяти Средний уровень сложности: • Искусственное ограничение, времени жизни объекта • Принудительное удаление объекта, не дожидаясь когда сработает GC Тяжелый уровень сложности: • Оптимизация размера данных • Компрессия/декомпрессия данных • Использование нескольких процессов, для реализации распределенного in memory cache, для случая x86 платформы Оптимизация памяти
  • 15. 15.NET Meetup 2017 Часть 4: Производительность
  • 16. 16.NET Meetup 2017 Профилирование производительности Ключевые параметры: • Общее время выполнения функции • Количество вызовов функции • Потоки в которых вызываются функции Направление: Оптимизируйте функции, которые вызываются наибольшее количество раз.
  • 17. 17.NET Meetup 2017 Профилирование производительности: Потоки Потоки в которых вызываются функции
  • 18. 18.NET Meetup 2017 Легкий уровень сложности: • Оптимизация ввода/вывода • Выбор оптимального алгоритма • Пакетная обработка данных • Параллельная обработка Средний уровень сложности: • Оптимизация блокировок, за счет более точного разделения множеств данных • Отложенное освобождение памяти, выделение памяти заранее • Отказ от использования динамических конструкций • Использование массивов • Использование struct вместо class • Использование цикла for • Отказ от использования volatile • Отказ от использования ThreadPool Тяжелый уровень сложности: • Векторизация кода (SSE, AVX) • Unsafe код • Inline методы • Выравнивание данных • Lock-free алгоритмы и структуры данных Оптимизации производительности
  • 19. 19.NET Meetup 2017 Часть 5: Взаимные блокировки
  • 20. 20.NET Meetup 2017 Ключевые параметры: • Общее время выполнения функции • Количество вызовов функции Направление: Поиск функций время выполнения которых, сильно изменяется после возникновения блокировки. Действия: • Шаг 1: Поиск функций, с наибольшим изменением времени. • Шаг 2: Анализ времени жизни потоков • Шаг 3: Внесение изменений в код • Шаг 4: Повторный запуск теста • Шаг 5: Сравнение результатов тестов. Поиск взаимных блокировок Шаг Процесс 1 Процесс 2 1 Хочет захватить A и B, начинает с A Хочет захватить A и B, начинает с B 2 Захватывает ресурс A Захватывает ресурс B 3 Ожидает освобождения ресурса B Ожидает освобождения ресурса A 4 Взаимная блокировка
  • 21. 21.NET Meetup 2017 Без блокировкиШаг №1: Методы Без блокировки
  • 22. 22.NET Meetup 2017 С блокировкойШаг №1: Методы С блокировкой
  • 23. 23.NET Meetup 2017 Шаг №2: ПотокиШаг №2: Потоки Без блокировки
  • 24. 24.NET Meetup 2017 Шаг №2: Потоки Шаг №2: Потоки С блокировкой
  • 25. 25.NET Meetup 2017 Ремарка: Хорошим тоном является, не вызывать блокировки из кода который стоит под блокировкой. Легкий уровень сложности: • Область применения блокировки, должна быть минимальной. Средний уровень сложности: • Разделение блокировок за счет разбиения кода на две функции до блокировки и после блокировки. Есть вероятность создания Livelock. Тяжелый уровень сложности: • Применение изменений к объектам через копии. Оптимизация блокировок
  • 26. 26.NET Meetup 2017 Livelock – зацикливание ожидания блокировок. Система, продолжает работу, ее состояние постоянно меняется за счет ожидания цикличного ожидания освобождения блокировки. Направление: Построение графа блокировок. Оптимизация блокировок
  • 27. 27.NET Meetup 2017 В завершении 40% • Определение целей • Выбор архитектуры которая наилучшим образом позволяет достигать целей Архитектура 30% • Хранение данных • Доступ к данным • Представление данных Данные 20% • Алгоритм, который позволяет достигать целей • Подготовка данных • Работа с результатом Алгоритмы 10% • Оптимизация производительности • Оптимизация памяти • Накладные расходы, при параллельной обработке Оптимизация кода Решения из которых складывается производительность:
  • 29. 29.NET Meetup 2017 Контакты: mail: AlexandrSaitov@gmail.com skype: LeonInc Всем спасибо за участие и до новых встреч!