SlideShare a Scribd company logo
Язык программирования OBERONИ его превосходство над другими жалкими языками программирования.
Нетривиальные ботлнекиКак искать и находить проблемы спамятью и производительностьюв высоконагруженных .Net приложениях,которые уже якобы до конца оптимизированны.
О самых распространённых, но скрытых проблемах.Об оптимизации уже существующих приложений.Тривиальные проблемы.Нетривиальные проблемы.О том, как быстро найти тормозное место.И о всяком другом помаленьку...О чём это всё?
ВасяNeuStringПишем софт для операторов сотовой связиОбо мне
Кто хоть иногда чинит скорость работы кода?Кто хоть иногда чинит количество занимаемой памяти?О вас
Обсудим как улучшать существующее, а не о том как надо правильно разрабатывать новое.Внутренние тормоза DB/SQL или Apache/IIS здесь разбираться не будут. Это архитектурные проблемы, а не кодерские.О презентации
Узкое местоПроблемаOптимизация... спрашивайте меня, будем определяться по ходу.Определимся с терминами
Частые обращения к вычисляемым даннымОдин потокДолгоиграющая операция не зависящая от насМедленный SQL скриптПрокси/очередь сообщенийМного итераций/выделений памятиБесполезное исполнение кода/выделение памятиМедленный алгоритмБанальные ботлнеки
Нетривиальный ботлнек №1Сохранение данных в хранилище (файл) длилось 2-3 минуты.Размер файла был огромен – гигабайты.Чтение, соответственно, тоже самое.Во время сохранения выделялось огромное количество памяти.
Результат бинарной сериализацииBinarySerializer~ 20 записейNew serializer~ 200 записей
Решение: рукописная сериализация.Вывод: бинарная сериализация в .Net –Нетривиальный ботлнек №1Сохранение данных в хранилище (файл) длилось 2-3 минуты.Размер файла был огромен – гигабайты.Чтение, соответственно, тоже самое.Во время сохранения выделялось огромное количество памяти.
Решение: найти повисший указатель.Нетривиальный ботлнек №2Почему-то память не высвобождалась.
public classItemClass{publiceventAction Edited;}//----------------------------------------------------//publicclassMyHugeClass{    publicList<ItemClass> Items { get; privateset; }    publicbool Changed { get; privateset; }    publicvoidSetItems(IEnumerable<ItemClass> items)    {this.Items= items.ToList();foreach(var item inthis.Items)        {item.Edited+= this.item_Edited;        }    }    publicvoiditem_Edited()    {this.Changed= true;    }}public class MyHugeClass
Связь объектовItemClassDelegateAuto-generated classMyHugeClass
Решение: найти повисший указатель.Вывод: static –Нетривиальный ботлнек №2Почему-то память не высвобождалась.
Решение: создать единое универсальное хранилище информации.Вывод: не храните дважды одно и тоже. Доступ к данным можно всегда ускорить.Нетривиальный ботлнек №3Приложение занимало много памяти.Хранение одной и той же информации в двух разных видах.Это делалось для быстрого поиска необходимого.
Решение: вычислять только необходимое.Нетривиальный ботлнек №4Вычислялись цифры, которые впоследствии никуда не выводились.
Тупой примеризлишних вычисленийpublicclassOneResult        {publicint Id { get; set; }publicstring A { get; set; }publicstring Caption { get; set; }publicdouble X { get; set; }publicdouble MinX { get; set; }publicdouble MaxX { get; set; }publicdouble MeanX { get; set; }publicdouble AverageX { get; set; }publicdoubleWeatherInfluencedX { get; set; }publicdoubleMoonInfluencedX { get; set; }        }publicdouble GetGrandTotalValue(DateTime start, DateTime stop)        {IEnumerable<OneResult> resultingList = this.ValuesSource.GetValuesForRange(start, stop);return resultingList.Select(res => res.X).Sum();        }
Решение: вычислять только необходимое.Вывод: не ленитесь создавать отдельные запросы для отдельных нужд.Нетривиальный ботлнек №4Вычислялись цифры, которые впоследствии никуда не выводились.
Решение: попробовать не вычислять её.Нетривиальный ботлнек №5Для вычисления одной из 10 цифр использовалось 50% памяти и 90% CPU.
- Hi, Nikolaj.Do you think “Value X” is that necessary?The matter is, it takes 50% of RAM and 90% of CPU.Can we remove it?- Hi, Vasiliy.Sure, get rid of it!Разговор с Product SpecialistЭта цифра бесполезна!!!
Решение: попробовать не вычислять её.Вывод: нужно знать специфику пользователей, их стандартные User Cases.Нетривиальный ботлнек №5Для вычисления одной из 10 цифр использовалось 50% памяти и 90% CPU.
Решение: переписать Dictionary -> стало занимать в 2,5 раз меньше памяти.Вывод: используйте оптимальное правильное хранилище для данных.Нетривиальный ботлнек №6Всё ещё отжирает кучу памяти.Оказалось, что самый ресурсоёмкий класс в системе был Dictionary<int, int>.
Решение: Перевести на потоковое чтение данных.Нетривиальный ботлнек №7Часто выделялись и освобождались ненужные куски памяти.Иногда выделяется ещё 200% к уже выделенной памяти.
int[] a1;int[] a2;// Проще всего написать вот так:publicIEnumerable<ItemClass> GetItemsByCondition(){List<int> result = newList<int>();result.AddRange(this.a1.Where(item => ...condition...));result.AddRange(this.a2.Where(item => ...condition...));    returnresult;}// А надо бы вот так:publicIEnumerable<ItemClass> GetItemsByCondition(){foreach(var item inthis.a1)if(...condition...)yieldreturn item;foreach(var item inthis.a2)if(...condition...)yieldreturn item;}Например, выбрать элементы по условию
Решение: Перевести на потокровое чтение данных.Вывод: создавайте как можно меньше коллекций.Нетривиальный ботлнек №7Часто выделялись и освобождать ненужные куски памяти.Иногда выдеяется ещё 200% к уже выделенной памяти.
0) Найти узкое место.1) Узнать, нужна ли эта функция пользователю?2) Нужно ли вызывать именно это место для достижения результата?3) Как можно сократить количество итераций?4) Оптимизировать код.Алгоритм борьбы с проблемами
Redgate ANTS – $JetBrains dotTrace – $Scitech Memory Profiler - $EQATEC Profiler – $nProf – free!!!SlimTune – free!!!... И т.д. И т.п. И пр.Профайлер
Redgate ANTS –$400-$800 (удобный, точный, быстрый, много фичей, самый популярный из всех)JetBrains dotTrace –$400-$800 (чуть менее удобный,чуть менее точный, быстрый, много фичей, free для OpenSource)Scitech Memory Profiler – $100-$300(толко для памяти, много фичей, чуть менее удобный)EQATEC Profiler – $150-$400 (быстрый, память не профайлит, менее точный, free для некоммерческих целей)nProf – free!!! (но не поддерживается уже 2 года, или больше)SlimTune – free!!! (но нифига не понятно как им пользоваться, сложный интерфейс)Профайлер
Посмотрим видео ролики?ANTS
Конец

More Related Content

PDF
Магия в Python: Дескрипторы. Что это?
PDF
Оптимизация производительности Python
PDF
Dmitry pilipenko i os gamekit
PDF
Kirill Zotin клиент серверное взаимодействие под android в деталях
PDF
Taras Kalapun ui testing
PDF
Winactie kleurplaten
PDF
Pavel kravchenko obj c runtime
PPTX
Time management training (Vadim Tikanov Ciklum)
Магия в Python: Дескрипторы. Что это?
Оптимизация производительности Python
Dmitry pilipenko i os gamekit
Kirill Zotin клиент серверное взаимодействие под android в деталях
Taras Kalapun ui testing
Winactie kleurplaten
Pavel kravchenko obj c runtime
Time management training (Vadim Tikanov Ciklum)

Similar to 05 net saturday vasiliy borovyak ''.net performance nontrivial bottlenecks'' (20)

PDF
На что уходит память - Константин Лопухин, PyCon RU 2014
PDF
Android: Как написать приложение, которое не тормозит
PDF
Илья Ефимов «IoC/DI на примере Autofac»
PDF
Илья Ефимов «IoC/DI на примере Autofac»
PPT
Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)
PPT
Web20 from zero
PDF
По колено в Си++ г... коде
PPTX
Dz Java Hi Load 0.4
PDF
Выявление неполадок в Java приложениях
PDF
Память в Java. Garbage Collector
PPTX
Программирование как способ выражения мыслей.
DOC
BusinessObjects глазами аналитика - Tern4
PDF
Собеседование на позицию Java Developer
PPT
Практическое создание крупного масштабируемого web 20 c нуля, Дмитрий Бородин
PPTX
Машинное обучение в электронной коммерции — практика использования и подводны...
PPT
практика 5
PDF
Евгений Жарков "Как быть хорошим фронтенд-разработчиком"
PDF
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...
PDF
Статический анализ и регулярные выражения
PPTX
Дмитрий Чирков, "Технологический стартап", занятие 2, 21.03.2012
На что уходит память - Константин Лопухин, PyCon RU 2014
Android: Как написать приложение, которое не тормозит
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»
Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)
Web20 from zero
По колено в Си++ г... коде
Dz Java Hi Load 0.4
Выявление неполадок в Java приложениях
Память в Java. Garbage Collector
Программирование как способ выражения мыслей.
BusinessObjects глазами аналитика - Tern4
Собеседование на позицию Java Developer
Практическое создание крупного масштабируемого web 20 c нуля, Дмитрий Бородин
Машинное обучение в электронной коммерции — практика использования и подводны...
практика 5
Евгений Жарков "Как быть хорошим фронтенд-разработчиком"
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...
Статический анализ и регулярные выражения
Дмитрий Чирков, "Технологический стартап", занятие 2, 21.03.2012
Ad

More from DneprCiklumEvents (12)

PPTX
Convert estimates to plans (Maxym Mykhalchuk Ciklum)
PPT
Vladimir kozhayev handmade isometry
ODP
Pavel yuriychuk svg in game development
PDF
Vitaly hit' abc_of_game_development
PPTX
04 net saturday eugene sukhikh ''the basic performance questions''
PPTX
04 net saturday eugene sukhikh ''the basic performance questions''
PPTX
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''
PPTX
03 net saturday anton samarskyy ''document oriented databases for the .net pl...
PPTX
02 net saturday roman gomolko ''mvvm in javascript using knockoutjs''
PPTX
01 net saturday alex krakovetskiy ''asp.net scaffolding''
PDF
Sergey Khlopenov tools for_development_cross_platform_mobile_ap
PDF
Segey Glebov tips and tricks for modern mobile project management
Convert estimates to plans (Maxym Mykhalchuk Ciklum)
Vladimir kozhayev handmade isometry
Pavel yuriychuk svg in game development
Vitaly hit' abc_of_game_development
04 net saturday eugene sukhikh ''the basic performance questions''
04 net saturday eugene sukhikh ''the basic performance questions''
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''
03 net saturday anton samarskyy ''document oriented databases for the .net pl...
02 net saturday roman gomolko ''mvvm in javascript using knockoutjs''
01 net saturday alex krakovetskiy ''asp.net scaffolding''
Sergey Khlopenov tools for_development_cross_platform_mobile_ap
Segey Glebov tips and tricks for modern mobile project management
Ad

05 net saturday vasiliy borovyak ''.net performance nontrivial bottlenecks''

  • 1. Язык программирования OBERONИ его превосходство над другими жалкими языками программирования.
  • 2. Нетривиальные ботлнекиКак искать и находить проблемы спамятью и производительностьюв высоконагруженных .Net приложениях,которые уже якобы до конца оптимизированны.
  • 3. О самых распространённых, но скрытых проблемах.Об оптимизации уже существующих приложений.Тривиальные проблемы.Нетривиальные проблемы.О том, как быстро найти тормозное место.И о всяком другом помаленьку...О чём это всё?
  • 4. ВасяNeuStringПишем софт для операторов сотовой связиОбо мне
  • 5. Кто хоть иногда чинит скорость работы кода?Кто хоть иногда чинит количество занимаемой памяти?О вас
  • 6. Обсудим как улучшать существующее, а не о том как надо правильно разрабатывать новое.Внутренние тормоза DB/SQL или Apache/IIS здесь разбираться не будут. Это архитектурные проблемы, а не кодерские.О презентации
  • 7. Узкое местоПроблемаOптимизация... спрашивайте меня, будем определяться по ходу.Определимся с терминами
  • 8. Частые обращения к вычисляемым даннымОдин потокДолгоиграющая операция не зависящая от насМедленный SQL скриптПрокси/очередь сообщенийМного итераций/выделений памятиБесполезное исполнение кода/выделение памятиМедленный алгоритмБанальные ботлнеки
  • 9. Нетривиальный ботлнек №1Сохранение данных в хранилище (файл) длилось 2-3 минуты.Размер файла был огромен – гигабайты.Чтение, соответственно, тоже самое.Во время сохранения выделялось огромное количество памяти.
  • 10. Результат бинарной сериализацииBinarySerializer~ 20 записейNew serializer~ 200 записей
  • 11. Решение: рукописная сериализация.Вывод: бинарная сериализация в .Net –Нетривиальный ботлнек №1Сохранение данных в хранилище (файл) длилось 2-3 минуты.Размер файла был огромен – гигабайты.Чтение, соответственно, тоже самое.Во время сохранения выделялось огромное количество памяти.
  • 12. Решение: найти повисший указатель.Нетривиальный ботлнек №2Почему-то память не высвобождалась.
  • 13. public classItemClass{publiceventAction Edited;}//----------------------------------------------------//publicclassMyHugeClass{ publicList<ItemClass> Items { get; privateset; } publicbool Changed { get; privateset; } publicvoidSetItems(IEnumerable<ItemClass> items) {this.Items= items.ToList();foreach(var item inthis.Items) {item.Edited+= this.item_Edited; } } publicvoiditem_Edited() {this.Changed= true; }}public class MyHugeClass
  • 15. Решение: найти повисший указатель.Вывод: static –Нетривиальный ботлнек №2Почему-то память не высвобождалась.
  • 16. Решение: создать единое универсальное хранилище информации.Вывод: не храните дважды одно и тоже. Доступ к данным можно всегда ускорить.Нетривиальный ботлнек №3Приложение занимало много памяти.Хранение одной и той же информации в двух разных видах.Это делалось для быстрого поиска необходимого.
  • 17. Решение: вычислять только необходимое.Нетривиальный ботлнек №4Вычислялись цифры, которые впоследствии никуда не выводились.
  • 18. Тупой примеризлишних вычисленийpublicclassOneResult {publicint Id { get; set; }publicstring A { get; set; }publicstring Caption { get; set; }publicdouble X { get; set; }publicdouble MinX { get; set; }publicdouble MaxX { get; set; }publicdouble MeanX { get; set; }publicdouble AverageX { get; set; }publicdoubleWeatherInfluencedX { get; set; }publicdoubleMoonInfluencedX { get; set; } }publicdouble GetGrandTotalValue(DateTime start, DateTime stop) {IEnumerable<OneResult> resultingList = this.ValuesSource.GetValuesForRange(start, stop);return resultingList.Select(res => res.X).Sum(); }
  • 19. Решение: вычислять только необходимое.Вывод: не ленитесь создавать отдельные запросы для отдельных нужд.Нетривиальный ботлнек №4Вычислялись цифры, которые впоследствии никуда не выводились.
  • 20. Решение: попробовать не вычислять её.Нетривиальный ботлнек №5Для вычисления одной из 10 цифр использовалось 50% памяти и 90% CPU.
  • 21. - Hi, Nikolaj.Do you think “Value X” is that necessary?The matter is, it takes 50% of RAM and 90% of CPU.Can we remove it?- Hi, Vasiliy.Sure, get rid of it!Разговор с Product SpecialistЭта цифра бесполезна!!!
  • 22. Решение: попробовать не вычислять её.Вывод: нужно знать специфику пользователей, их стандартные User Cases.Нетривиальный ботлнек №5Для вычисления одной из 10 цифр использовалось 50% памяти и 90% CPU.
  • 23. Решение: переписать Dictionary -> стало занимать в 2,5 раз меньше памяти.Вывод: используйте оптимальное правильное хранилище для данных.Нетривиальный ботлнек №6Всё ещё отжирает кучу памяти.Оказалось, что самый ресурсоёмкий класс в системе был Dictionary<int, int>.
  • 24. Решение: Перевести на потоковое чтение данных.Нетривиальный ботлнек №7Часто выделялись и освобождались ненужные куски памяти.Иногда выделяется ещё 200% к уже выделенной памяти.
  • 25. int[] a1;int[] a2;// Проще всего написать вот так:publicIEnumerable<ItemClass> GetItemsByCondition(){List<int> result = newList<int>();result.AddRange(this.a1.Where(item => ...condition...));result.AddRange(this.a2.Where(item => ...condition...)); returnresult;}// А надо бы вот так:publicIEnumerable<ItemClass> GetItemsByCondition(){foreach(var item inthis.a1)if(...condition...)yieldreturn item;foreach(var item inthis.a2)if(...condition...)yieldreturn item;}Например, выбрать элементы по условию
  • 26. Решение: Перевести на потокровое чтение данных.Вывод: создавайте как можно меньше коллекций.Нетривиальный ботлнек №7Часто выделялись и освобождать ненужные куски памяти.Иногда выдеяется ещё 200% к уже выделенной памяти.
  • 27. 0) Найти узкое место.1) Узнать, нужна ли эта функция пользователю?2) Нужно ли вызывать именно это место для достижения результата?3) Как можно сократить количество итераций?4) Оптимизировать код.Алгоритм борьбы с проблемами
  • 28. Redgate ANTS – $JetBrains dotTrace – $Scitech Memory Profiler - $EQATEC Profiler – $nProf – free!!!SlimTune – free!!!... И т.д. И т.п. И пр.Профайлер
  • 29. Redgate ANTS –$400-$800 (удобный, точный, быстрый, много фичей, самый популярный из всех)JetBrains dotTrace –$400-$800 (чуть менее удобный,чуть менее точный, быстрый, много фичей, free для OpenSource)Scitech Memory Profiler – $100-$300(толко для памяти, много фичей, чуть менее удобный)EQATEC Profiler – $150-$400 (быстрый, память не профайлит, менее точный, free для некоммерческих целей)nProf – free!!! (но не поддерживается уже 2 года, или больше)SlimTune – free!!! (но нифига не понятно как им пользоваться, сложный интерфейс)Профайлер

Editor's Notes

  • #5: Разрабатываю десктопное приложение, которое загружает в себя миллиард записей из базы данных, где каждая запись - минимум 150 байт. Итого имеем 150ГБ. Хотя нашими усилиями оно занимает всего 0,5ГБ.Когда мы только получили приложение на доработку (как всегда да? украинцы переделывают чье-то плохой в хорошее), каких-то там миллион записей съедал 4ГБ ОЗУ и обрабатывался 6 часов.Сейчас эта же операция занимает 5-10 минут и съедает до 20МБ.
  • #7: Здесь будут высказаны несколько полезных идей, которые должны натолкнуть вас на идею по улучшению продукта, над которым вы сейчас работаете.На этой презентации не будет банальщины вроде &quot;Сервер перегружен запросами, что делать?&quot; или &quot;БД не справляется, как переписать SQL скрипт?&quot;. Ответы на подобное очевидны. На этой презентации вы узнаете как оптимально оперировать с большими объемами информации в памяти. Разбираться будет тот момент, когда вы определили, что узкое место не IIS/Апач или БД, а какой-то C# код.
  • #8: Узкое место - не всегда проблема.Проблема – не всегда узкое место.Например, если приложение стартует довольно долго, то это мало кого волнует, ибо одноразово и пользователя не напрягает особо.Или идёт длительная работа с данными, результат которой потом игнорируется. Зачем тогда оптимизировать код, если его можно вообще выкинуть?Оптимизация - это выбор правильного оператора (типа for или foreach). НЕТ! Оптимизация - это сокращение количества итераций.
  • #17: Хранение одной и той же информации больше одного раза.Во-первых поддержка нескольких хранилищ - это гемор по синхронизации и доступу. Во-вторых при больших объемах экономится куча памяти.  Даже если две копии дублируют между собой 50% информации - уже пора избавляться.Сложность здесь в том, что нужно очень хорошо продумать хранилище. Доступ должен быть быстрым и удобным. Можно даже кеширование прикручивать.
  • #24: Где можно string заменяйте на int (например номера телефонов, или глобальные координаты)
  • #25: Например с байтовых буферов перевести на Stream.
  • #26: Есть у нас две коллекции.И надо из них выбрать элементы по спец. условию.Но здесь мы СОЗДАЛИ НОВУЮ коллекцию. Создание – это и есть проход по новой коллекции. Потом есть второй проход по коллекции, собсно чтение новой коллекции.А во втором случае, коллекции нет первого прохода, сразу второй. И память экономим.
  • #27: Например с байтовых буферов перевести на Stream.
  • #28: Это основной слайд презентации.Итак, есть проблема от продакт специалистов – тупит! Алгоритм решения этой проблемы следующий...
  • #31: Проиграть видео 1 и 2, если успевается.