3. Алгоритмическая производительность
• DotTrace – как инструмент анализа
производительности
• Sampling: почти «честное» время выполнения,
профилирование практически не накладное по
производительности
4. Алгоритмическая производительность
• Tracing: дорогое профилирование, не отражает
реального времени выполнения, но показывает
количество вызов
• Timeline: инструмент для анализа
производительности многопоточных приложений
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
• Стараемся не создавать новых объектов, там, где
не нужно.
• Объекты зачастую неожиданно создаются в
неочевидных местах.
22. Соображения о структурах данных
• Equals вызывается чаще чем GetEntry? – см.
коллизии
• Интернирующие структуры данных
• StringSlice – лекарство против SubString
26. LOH
• Объекты в LOH никогда не перемещаются
• LOH только растет и никогда не уменьшается (т.е.
если объект собран сборщиком мусора, размер
LOH все равно остается неизменным)
• Хип LOH освобождается только тогда, когда LOH
полностью пуст
• Как следствие – OutOfMemory из-за сильно
фрагментированной памяти
28. Boxing
• Очевидные проблемы: используем value types в
качестве reference types
• public struct ToBeBoxed : IMySuperInterface {…}
• Не забываем что все итераторы – struct’ы!
29. .NET method group bug
Lambda
Delegate target Method group Ratio
expression
Class 329 463 0.71
Interface 24474 461 53.1
Struct 28372 400 71.0
30. Более общие соображения
• «Кризис среднего возраста» для объектов
• Есть смысл задумать о том, в каком поколении
собираются объекты. Желательно, чтобы в Gen0
• WeakReferences – только в крайнем случае.
31. Caches: тонкости
• LevelDb – храним кэши на диске
• DirectMappedCache, LRUWeakReferenceCache –
«вытесняющие» словари с ограниченным
размером
32. UI Thread: тонкости в обращении
• Chunked operations – прерываем операции в
других потоках, чтобы не зависать в UI потоке
• InterruptableReadactivityCookie – операция,
прерываемая в том числе по WriteLock.Acquire() из
UI потока