2013-11-13 4 views
1

Я хотел бы знать, сколько памяти потребляет данная структура данных. Поэтому предположим, что у меня есть параллельный связанный список. Я хотел бы знать, насколько велик список. У меня есть несколько вариантов: malloc_hooks, который я не думаю, является потокобезопасным, и getrusage's ru_maxrss, но я действительно не знаю, что это дает мне (сколько памяти весь процесс потребляет во время его выполнения?). Я хотел бы знать, действительно ли кто-то измерял потребление памяти таким образом. Есть ли инструмент для этого? Как massif тариф?Потребление памяти параллельной структуры данных в C

+0

Кто-нибудь знает о http://man7.org/linux/man-pages/man3/mallinfo.3.html? –

ответ

1

Чтобы понять, сколько байтов на самом деле стоит malloc, некоторые структуры, например узел связанного списка, создают изолированный тестовый пример (не параллельный!), Который выделяет тысячи из них, и просматривает значения дельта в использование памяти программы. Существуют различные способы сделать это. Если ваша библиотека имеет структуру mallinfo, такую ​​как библиотека GNU C, найденная в системах GNU/Linux, вы можете просмотреть статистику до и после. Другой способ - проследить системные вызовы программы, чтобы посмотреть ее схему выделения из ОС. Если, скажем, мы выделяем 10 000 000 узлов списка, а программа выполняет вызов sbrk() около 39 000 раз, увеличивая размер процесса на 8192 байта в каждом вызове, то это означает, что узел списка занимает 32 байта, накладные расходы и все.

Помня о том, что выделение тысяч объектов одного размера в одном потоке не реально отражает фактическое использование памяти в реалистичной программе, которая включает фрагментацию.

Если вы хотите выделить небольшие структуры и приблизиться к тому, чтобы не тратить впустую байта (или не вызывать никаких отходов, о которых вы не знаете и не контролируете), а также для управления фрагментацией, выделите большие массивы объектов из malloc. (или ваш системный распределитель выбора) и разбейте их самостоятельно. В malloc все еще неизвестны накладные расходы, но он разделен на большое количество объектов, что делает его незначительным.

Или, как правило, напишите свой собственный распределитель, чье поведение и накладные расходы вы понимаете подробно, и который сам берет большие куски из системы.

0

Концептуально говоря вам нужно знать количество предметов, с которыми вы работаете. Затем вам нужно знать размер каждого другого типа данных, используемого в вашей структуре данных. Вы также должны будете учитывать размер указателей или что-то, что несколько использует какую-то память.

Тогда вы можете придумать формулу, которая выглядит следующим:

Потребление = N * (SizeOf (типы данных)).

Другими словами, вы хотите, чтобы вы добавляли какой-либо тип данных вместе (размер типа данных) и умножали его на количество элементов.

Смежные вопросы