Your SlideShare is downloading. ×
CodeFest 2013. Скрыган К. — Оптимизация .Net приложений на примере Resharper
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

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

602
views

Published on


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

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

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide
  • Конкретный пример здесь!
  • Transcript

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