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

989 views
936 views

Published on

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

No Downloads
Views
Total views
989
On SlideShare
0
From Embeds
0
Number of Embeds
436
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

    ×