SlideShare a Scribd company logo
1 of 31
Язык программирования 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
Связь объектов ItemClass Delegate Auto-generated class MyHugeClass
Решение: найти повисший указатель. Вывод: 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

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

На что уходит память - Константин Лопухин, PyCon RU 2014
На что уходит память - Константин Лопухин, PyCon RU 2014На что уходит память - Константин Лопухин, PyCon RU 2014
На что уходит память - Константин Лопухин, PyCon RU 2014it-people
 
Android: Как написать приложение, которое не тормозит
Android: Как  написать приложение, которое не тормозитAndroid: Как  написать приложение, которое не тормозит
Android: Как написать приложение, которое не тормозитElena Kotina
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»MskDotNet Community
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Yulia Tsisyk
 
Web20 from zero
Web20 from zeroWeb20 from zero
Web20 from zeroqweasdrty
 
Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)
Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)
Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)Ontico
 
По колено в Си++ г... коде
По колено в Си++ г... кодеПо колено в Си++ г... коде
По колено в Си++ г... кодеTatyanazaxarova
 
Dz Java Hi Load 0.4
Dz Java Hi Load 0.4Dz Java Hi Load 0.4
Dz Java Hi Load 0.4HighLoad2009
 
Выявление неполадок в Java приложениях
Выявление неполадок в Java приложенияхВыявление неполадок в Java приложениях
Выявление неполадок в Java приложенияхPavel Grushetzky
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage CollectorOlexandra Dmytrenko
 
Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей. Программирование как способ выражения мыслей.
Программирование как способ выражения мыслей. Levon Avakyan
 
BusinessObjects глазами аналитика - Tern4
BusinessObjects глазами аналитика -  Tern4 BusinessObjects глазами аналитика -  Tern4
BusinessObjects глазами аналитика - Tern4 Valeriy Titov
 
Собеседование на позицию Java Developer
Собеседование на позицию Java DeveloperСобеседование на позицию Java Developer
Собеседование на позицию Java DeveloperOlexandra Dmytrenko
 
Практическое создание крупного масштабируемого web 20 c нуля, Дмитрий Бородин
Практическое создание крупного масштабируемого web 20 c нуля, Дмитрий БородинПрактическое создание крупного масштабируемого web 20 c нуля, Дмитрий Бородин
Практическое создание крупного масштабируемого web 20 c нуля, Дмитрий БородинFuenteovejuna
 
Машинное обучение в электронной коммерции — практика использования и подводны...
Машинное обучение в электронной коммерции — практика использования и подводны...Машинное обучение в электронной коммерции — практика использования и подводны...
Машинное обучение в электронной коммерции — практика использования и подводны...Ontico
 
практика 5
практика 5практика 5
практика 5student_kai
 
Евгений Жарков "Как быть хорошим фронтенд-разработчиком"
Евгений Жарков "Как быть хорошим фронтенд-разработчиком"Евгений Жарков "Как быть хорошим фронтенд-разработчиком"
Евгений Жарков "Как быть хорошим фронтенд-разработчиком"Fwdays
 
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...corehard_by
 
Статический анализ и регулярные выражения
Статический анализ и регулярные выраженияСтатический анализ и регулярные выражения
Статический анализ и регулярные выраженияTatyanazaxarova
 
Дмитрий Чирков, "Технологический стартап", занятие 2, 21.03.2012
Дмитрий Чирков, "Технологический стартап", занятие 2, 21.03.2012Дмитрий Чирков, "Технологический стартап", занятие 2, 21.03.2012
Дмитрий Чирков, "Технологический стартап", занятие 2, 21.03.2012ideaperm
 

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

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

More from DneprCiklumEvents

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

More from DneprCiklumEvents (12)

Convert estimates to plans (Maxym Mykhalchuk Ciklum)
Convert estimates to plans (Maxym Mykhalchuk Ciklum)Convert estimates to plans (Maxym Mykhalchuk Ciklum)
Convert estimates to plans (Maxym Mykhalchuk Ciklum)
 
Vladimir kozhayev handmade isometry
Vladimir kozhayev handmade isometryVladimir kozhayev handmade isometry
Vladimir kozhayev handmade isometry
 
Pavel yuriychuk svg in game development
Pavel yuriychuk svg in game developmentPavel yuriychuk svg in game development
Pavel yuriychuk svg in game development
 
Vitaly hit' abc_of_game_development
Vitaly hit' abc_of_game_developmentVitaly hit' abc_of_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''04 net saturday eugene sukhikh ''the basic performance questions''
04 net saturday eugene sukhikh ''the basic performance questions''
 
04 net saturday eugene sukhikh ''the basic performance questions''
04 net saturday eugene sukhikh ''the basic performance questions''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''
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''06 net saturday eugene zharkov ''silverlight. to oob or not to oob''
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''
 
03 net saturday anton samarskyy ''document oriented databases for the .net pl...
03 net saturday anton samarskyy ''document oriented databases for the .net pl...03 net saturday anton samarskyy ''document oriented databases for the .net pl...
03 net saturday anton samarskyy ''document oriented databases for the .net pl...
 
02 net saturday roman gomolko ''mvvm in javascript using knockoutjs''
02 net saturday roman gomolko ''mvvm in javascript using knockoutjs''02 net saturday roman gomolko ''mvvm in javascript using knockoutjs''
02 net saturday roman gomolko ''mvvm in javascript using knockoutjs''
 
01 net saturday alex krakovetskiy ''asp.net scaffolding''
01 net saturday alex  krakovetskiy ''asp.net scaffolding''01 net saturday alex  krakovetskiy ''asp.net scaffolding''
01 net saturday alex krakovetskiy ''asp.net scaffolding''
 
Sergey Khlopenov tools for_development_cross_platform_mobile_ap
Sergey Khlopenov tools for_development_cross_platform_mobile_apSergey Khlopenov tools for_development_cross_platform_mobile_ap
Sergey Khlopenov tools for_development_cross_platform_mobile_ap
 
Segey Glebov tips and tricks for modern mobile project management
Segey Glebov tips and tricks for modern mobile project managementSegey Glebov tips and tricks for modern mobile project management
Segey Glebov tips and tricks for modern mobile project management
 

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
  • 14. Связь объектов ItemClass Delegate Auto-generated 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

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