Увеличение использования POOL - синглтон - PullRequest
4 голосов
/ 27 января 2011

Я начал использовать пулы буста как синглтон, определенный в boost / pool / singleton_pool.hpp, так как мне нужно многократно выделять множество структур одного размера. Улучшение производительности является феноменальным, так как я использовал malloc раньше.

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

Также, когда скорость передачи данных производителя увеличивается, общее использование памяти, кажется, увеличивается в кусках ~ 10k, но никогда не уменьшается даже после вызова free для объектов в пуле.

Я хотел бы периодически вести домашнее хозяйство, чтобы освободить фрагменты памяти, чтобы уменьшить общее использование памяти процессом. Это возможно? Я не могу использовать purge_memory, так как это будет означать, что мне придется синхронизировать чистку между производителями и потребителями. Кстати, purge_memory освобождает блок, то есть уменьшает использование памяти в диспетчере задач?

Я программирую в MS Windows.

Спасибо Ниладри

PS - я попытался использовать release_memory, упорядочив пул (order_malloc), но он всегда возвращает false.

UPDATE:

Еще не пробовал purge_memory, так как пул разделен между двумя потоками. Но обнаружили, что release_memory работает, но только для упорядоченных пулов и медленно освобождает память, поскольку освобождает только блоки памяти без выделения.

Я уверен, что продувка будет работать быстрее.

Ответы [ 3 ]

3 голосов
/ 27 января 2011

Согласно документ :

bool t.release_memory()

т должен быть заказан. Освобождает каждый блок памяти, в котором нет выделенных фрагментов. Возвращает true, если хотя бы один блок памяти был освобожден.

bool t.purge_memory()

Освобождает каждый блок памяти. Эта функция делает недействительными любые указатели, ранее возвращенные функциями размещения t. Возвращает true, если хотя бы один блок памяти был освобожден.

Итак, чтобы освободить память, вам нужно использовать purge_memory(). Вы можете сделать это, только если все указатели, которые вы получили через пул, больше не используются!

Если release_memory возвращает true, значит, ваша память все еще используется ...

my2c

1 голос
/ 27 января 2011

Вот как boost::pool работает, и поэтому ваши ассигнования такие быстрые. Когда вы перераспределяете объект, вы на самом деле ничего не перераспределяете. boost::pool в основном говорит, что область памяти доступна для другого объекта такого размера. Так что нет, вы не увидите, как расходуется память при освобождении объектов, потому что так работает пул объектов У вас есть кусок предварительно выделенной памяти, и вы используете этот кусок памяти для создания своих объектов. А «пул объектов» как бы:)

0 голосов
/ 27 января 2011

Еще не пробовал purge_memory, так как пул разделен между двумя потоками.Но обнаружили, что release_memory работает, но только для упорядоченных пулов и медленно освобождает память, поскольку освобождает только блоки памяти без выделения.

Очистка будет работать быстрее, я уверен.

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