Я хотел бы знать общий объем памяти, выделенной во время выполнения метода.Пока у меня есть:
GC.Collect()
GC.WaitForPendingFinalizers()
memStart = GC.GetTotalMemory(false)
f()
memEnd = GC.GetTotalMemory(false)
print (memEnd - memStart)
Это кажется достаточно хорошим для простых функций, но когда f
выделяет так много, что вызывает сбор, тогда результат исключает уже собранные объекты.Более того, невозможно сказать, что это «переполнение» произошло.
Есть ли простой способ сделать это?Без покупки / установки / настройки профилировщика памяти?Что-то вроде секундомера для распределителя / сборщика было бы идеально.Так что я могу сделать:
sw = new GCStopwatch()
sw.Start()
f()
sw.Stop()
print sw.TotalBytesAllocated
print sw.NumberOfCollections
// etc
Я хочу это, чтобы я мог узнать, какое давление метод оказывает на сборщик мусора.Мой код читает числа из строки фиксированной длины, используя множество вызовов вдоль строк Int32.Parse(s.Substring(4,6))
, и я подумал о том, чтобы выполнить синтаксический анализ на месте, введя ParseInt(String s, int startIndex, int length)
, чтобы избежать выделения десятков тысяч подстрок.Но это был бы хороший инструмент для других сценариев.