Куча Linux - делает кучу новых / удаляет нормально или куча становится сильно фрагментированной? - PullRequest
6 голосов
/ 27 августа 2011

Я не знаком с тем, как распределяется куча Linux.

Я вызываю malloc () / free () много раз в секунду, всегда с одинаковыми размерами (существует около 10 структур, каждый фиксированный размер). Помимо времени инициализации, моя память не выделяется на длительные периоды времени.

Это считается плохой формой со стандартными кучами? (Я уверен, что кто-то спросит «какую кучу вы используете?» - «Тьфу. Стандартная статическая куча» ... значит, я не уверен.)

Должен ли я вместо этого использовать свободный список или куча терпит много одинаковых выделений. Я пытаюсь сбалансировать удобочитаемость с производительностью.

Какие-нибудь инструменты, которые помогут мне измерить?

Ответы [ 3 ]

11 голосов
/ 27 августа 2011

Прежде всего, если у вас измерено проблема с увеличением использования памяти, даже не думайте об использовании пользовательского распределителя.Это одна из худших форм преждевременной оптимизации.

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

Для решения вашего конкретного вопроса распределитель glibc основан на алгоритме dlmalloc, который почти оптимален, когда дело доходит до фрагментации.Единственный способ заставить его плохо фрагментировать память - это неизбежный путь: выделение объектов с чередующимся временем жизни поочередно, например, выделение большого количества объектов, но только освобождение каждого другого.Я думаю, вам будет трудно выработать схему распределения, которая даст худшее общее использование памяти, чем пулы ...

4 голосов
/ 27 августа 2011

Valgrind имеет специальный инструмент Массив для измерения использования памяти.Это должно помочь профилировать распределения кучи.

0 голосов
/ 28 августа 2011

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

Как определяется срок службы ваших структур? Если вы можете выразить время жизни вашего объекта в области видимости, то это действительно увеличит производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...