Как мыоптимизировалиReSharperСкрыган Кирилл,JetBrains
DotTrace
Алгоритмическая производительность• DotTrace – как инструмент анализа  производительности• Sampling: почти «честное» время...
Алгоритмическая производительность• Tracing: дорогое профилирование, не отражает  реального времени выполнения, но показыв...
Типичные продолбы• Алгоритмический «взрыв» (квадрат или больше)• Ожидание на lock’ах• Memory traffic (о нём поподробнее )
Memory traffic: GC• В деталях, механику CLR GC не знает никто, кроме  самих CLR team. Алгоритмы и принципы CLR GC  весьма ...
Memory traffic: GC• «Stop-the-world» - блокировка всех трэдов• Чем больше memory traffic – тем чаще вызывается  GC• LOH – ...
Memory traffic• Стараемся не создавать новых объектов, там, где  не нужно.• Объекты зачастую неожиданно создаются в  неоче...
Замыкания: то, что видим мы
Замыкания: что генерируется
Params: что мы видим
Params всегда аллоцирует объект!
Две лямбды…
…и только один замыкающий класс!
Yield
Во что компилируется yield
Closure scope
Ну и самое «сладкое»: IList vs List 
Memory traffic: прочие примеры• LinQ, Select and others• Guid.ToString() создаёт дважды. Можно переписать  через stackalloc
ReSharper: статический анализ
Соображения о структурах данных• Equals вызывается чаще чем GetEntry? – см.  коллизии• Интернирующие структуры данных• Str...
StringSlice в лексере                        INTERN
Неочевидные соображения о структурахданных : LocalList
LOH• Объекты в LOH никогда не перемещаются• LOH только растет и никогда не уменьшается (т.е.  если объект собран сборщиком...
Пример: ChunkList
Boxing• Очевидные проблемы: используем value types в  качестве reference types• public struct ToBeBoxed : IMySuperInterfac...
.NET method group bug                                 LambdaDelegate target   Method group                Ratio           ...
Более общие соображения• «Кризис среднего возраста» для объектов• Есть смысл задумать о том, в каком поколении  собираются...
Caches: тонкости• LevelDb – храним кэши на диске• DirectMappedCache, LRUWeakReferenceCache –  «вытесняющие» словари с огра...
UI Thread: тонкости в обращении• Chunked operations – прерываем операции в  других потоках, чтобы не зависать в UI потоке•...
Tools• ReSharper – статический анализ кода на  performance issues.• DotTrace – профилятор• DotMemory, .NET Memory Profiler...
Вопросы?Скрыган Кирилл,JetBrainsKirill.skrygan@jetbrains.comtwitter.com/kskrygan
CodeFest 2013. Скрыган К. — Оптимизация .Net приложений на примере Resharper
CodeFest 2013. Скрыган К. — Оптимизация .Net приложений на примере Resharper
Upcoming SlideShare
Loading in...5
×

CodeFest 2013. Скрыган К. — Оптимизация .Net приложений на примере Resharper

756

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
756
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
5
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • Конкретный пример здесь!
  • CodeFest 2013. Скрыган К. — Оптимизация .Net приложений на примере Resharper

    1. 1. Как мыоптимизировалиReSharperСкрыган Кирилл,JetBrains
    2. 2. DotTrace
    3. 3. Алгоритмическая производительность• DotTrace – как инструмент анализа производительности• Sampling: почти «честное» время выполнения, профилирование практически не накладное по производительности
    4. 4. Алгоритмическая производительность• Tracing: дорогое профилирование, не отражает реального времени выполнения, но показывает количество вызов• Timeline: инструмент для анализа производительности многопоточных приложений
    5. 5. Типичные продолбы• Алгоритмический «взрыв» (квадрат или больше)• Ожидание на lock’ах• Memory traffic (о нём поподробнее )
    6. 6. Memory traffic: GC• В деталях, механику CLR GC не знает никто, кроме самих CLR team. Алгоритмы и принципы CLR GC весьма закрыты.
    7. 7. Memory traffic: GC• «Stop-the-world» - блокировка всех трэдов• Чем больше memory traffic – тем чаще вызывается GC• LOH – Large Object Heap (>82 Кб) – специальная куча для больших объектов
    8. 8. Memory traffic• Стараемся не создавать новых объектов, там, где не нужно.• Объекты зачастую неожиданно создаются в неочевидных местах.
    9. 9. Замыкания: то, что видим мы
    10. 10. Замыкания: что генерируется
    11. 11. Params: что мы видим
    12. 12. Params всегда аллоцирует объект!
    13. 13. Две лямбды…
    14. 14. …и только один замыкающий класс!
    15. 15. Yield
    16. 16. Во что компилируется yield
    17. 17. Closure scope
    18. 18. Ну и самое «сладкое»: IList vs List 
    19. 19. Memory traffic: прочие примеры• LinQ, Select and others• Guid.ToString() создаёт дважды. Можно переписать через stackalloc
    20. 20. ReSharper: статический анализ
    21. 21. Соображения о структурах данных• Equals вызывается чаще чем GetEntry? – см. коллизии• Интернирующие структуры данных• StringSlice – лекарство против SubString
    22. 22. StringSlice в лексере INTERN
    23. 23. Неочевидные соображения о структурахданных : LocalList
    24. 24. LOH• Объекты в LOH никогда не перемещаются• LOH только растет и никогда не уменьшается (т.е. если объект собран сборщиком мусора, размер LOH все равно остается неизменным)• Хип LOH освобождается только тогда, когда LOH полностью пуст• Как следствие – OutOfMemory из-за сильно фрагментированной памяти
    25. 25. Пример: ChunkList
    26. 26. Boxing• Очевидные проблемы: используем value types в качестве reference types• public struct ToBeBoxed : IMySuperInterface {…}• Не забываем что все итераторы – struct’ы!
    27. 27. .NET method group bug LambdaDelegate target Method group Ratio expressionClass 329 463 0.71Interface 24474 461 53.1Struct 28372 400 71.0
    28. 28. Более общие соображения• «Кризис среднего возраста» для объектов• Есть смысл задумать о том, в каком поколении собираются объекты. Желательно, чтобы в Gen0 • WeakReferences – только в крайнем случае.
    29. 29. Caches: тонкости• LevelDb – храним кэши на диске• DirectMappedCache, LRUWeakReferenceCache – «вытесняющие» словари с ограниченным размером
    30. 30. UI Thread: тонкости в обращении• Chunked operations – прерываем операции в других потоках, чтобы не зависать в UI потоке• InterruptableReadactivityCookie – операция, прерываемая в том числе по WriteLock.Acquire() из UI потока
    31. 31. Tools• ReSharper – статический анализ кода на performance issues.• DotTrace – профилятор• DotMemory, .NET Memory Profiler – memory- профилятор• DotPeek (ReSharper) – декомпилятор• Ildasm.exe
    32. 32. Вопросы?Скрыган Кирилл,JetBrainsKirill.skrygan@jetbrains.comtwitter.com/kskrygan
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×