Как найти объем памяти, выделенный методом? - PullRequest
1 голос
/ 24 февраля 2011

Я хотел бы знать общий объем памяти, выделенной во время выполнения метода.Пока у меня есть:

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), чтобы избежать выделения десятков тысяч подстрок.Но это был бы хороший инструмент для других сценариев.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2011

Я знаю, что вы сказали, что не хотите использовать профилировщик памяти, но это именно та ситуация, в которой вы полезны. Просто скачайте что-то вроде ANTS Memory Profiler и используйте 14-дневная бесплатная пробная версия. Это должно дать вам довольно мгновенную картину того, что происходит.

0 голосов
/ 24 февраля 2011

Я всегда использовал счетчики производительности для такого анализа.Не идеально, но обычно достаточно хорошо.

GC.Collect()
GC.WaitForPendingFinalizers()

Эти две строки не будут ждать, пока сборщик мусора действительно завершит работу.В любом случае во время вызова функции может произойти сборка мусора.Может быть, лучше просто измерить производительность / время в качестве оптимизации.

...