Что является лучшим решением для замены нового распределителя памяти в существующем коде? - PullRequest
7 голосов
/ 05 октября 2009

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

У меня есть приложение на C ++, которое использует операторы malloc и new во многих местах. Я думал, что замена их чем-то вроде ptmalloc может улучшить его производительность. Но мне интересно, как действует оператор new при использовании в приложении C ++, работающем в Linux? Использует ли он стандартное поведение malloc или что-то еще?

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

Ответы [ 4 ]

2 голосов
/ 05 октября 2009

Из документации TCMalloc :

Чтобы использовать TCmalloc, просто свяжите tcmalloc с приложением через флаг компоновщика "-ltcmalloc". Вы можете использовать tcmalloc в приложениях, которые сами не компилировали, используя LD_PRELOAD:

$ LD_PRELOAD = "/ usr / lib / libtcmalloc.so"

ptmalloc кажется похожим (но если вы работаете в Linux, вы, вероятно, уже используете его , потому что он является частью библиотеки GNU C ).

Я бы ожидал, что operator new вызовет malloc, но вы можете легко проверить это самостоятельно, установив точку останова на malloc, а затем позвонив new. Если ваш new не вызывает malloc, , вы можете переопределить его так, чтобы он набрал .

1 голос
/ 05 октября 2009

Если ваша программа многопоточная, то высоко ценится распределитель Hoard . Лично я не думаю, что это стоит беспокоиться о Linux, так как ptmalloc от glibc уже довольно хорош.

0 голосов
/ 05 октября 2009

Сколько времени ваше приложение тратит на распределение памяти?

0 голосов
/ 05 октября 2009

Я думаю, что переезд определенно возможен. Вы можете просто связать свое приложение с новой библиотекой реализации, которую вы хотите, и все вызовы нового, malloc будут переопределены. Я этого не сделал. Но я предполагаю, что это возможно, потому что при использовании valgrind он использует свои собственные распределители памяти, чтобы отслеживать статистику использования памяти приложением и в итоге дает результат. Так что, если это возможно, определенно должен быть способ.

Проверьте эту ссылку . Он содержит информацию о библиотеке smartheap, которая похожего вида!

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