Единственный способ действительно определить, какой распределитель памяти подходит для вашего приложения, - это попробовать несколько. Все упомянутые распределители были написаны умными людьми и превзойдут другие в том или ином микробенчмарке. Если все, что ваше приложение делает в течение всего дня, это malloc один 8-байтовый фрагмент в потоке A и освобождает его в потоке B, и ему вообще не нужно обрабатывать что-либо еще, вы, вероятно, могли бы написать распределитель памяти, который отбивает штаны от любого из перечисленные до сих пор. Это просто не будет очень полезно для чего-то другого. :)
У меня есть некоторый опыт использования Hoard там, где я работаю (достаточно, чтобы одна из наиболее неясных ошибок, исправленных в недавнем выпуске 3.8, была обнаружена в результате этого опыта). Это очень хороший распределитель, но насколько он хорош для вас, зависит от вашей рабочей нагрузки. И вам действительно нужно заплатить за Hoard (хотя это не слишком дорого), чтобы использовать его в коммерческом проекте без использования вашего кода под лицензией GPL.
Очень немного адаптированный ptmalloc2 уже довольно давно является распределителем памяти malloc в glibc, поэтому он невероятно широко используется и тестируется. Если стабильность важна превыше всего, это может быть хорошим выбором, но вы не упомянули об этом в своем списке, поэтому я предполагаю, что это не так. Для определенных рабочих нагрузок это ужасно, но то же самое верно и для любого malloc общего назначения.
Если вы готовы за это заплатить (а цена разумная, по моему опыту), SmartHeap SMP также является хорошим выбором. Большинство других упомянутых распределителей разработаны как вставные замены malloc / free new / delete, которые могут быть выполнены с помощью LD_PRELOAD. SmartHeap можно использовать и таким образом, но он также включает в себя весь API, связанный с распределением, который позволяет вам точно настраивать ваши распределители в соответствии с вашими пожеланиями. В проведенных нами тестах (опять же, очень специфичных для конкретного приложения) SmartHeap был примерно таким же, как и Hoard, когда выступал в качестве замены вставляемого malloc; реальная разница между ними - степень настройки. Чем менее универсальным будет ваш распределитель, тем выше будет производительность.
И в зависимости от вашего варианта использования многопоточный распределитель общего назначения может быть совсем не тем, что вы хотите использовать; если вы постоянно выделяете и освобождаете объекты одинакового размера, вы можете просто написать простой распределитель slab. Распределение Slab используется в нескольких местах ядра Linux, которые соответствуют этому описанию. (Я бы дал вам еще пару полезных ссылок, но я «новый пользователь», и Stack Overflow решил, что новым пользователям не разрешается быть тоже полезными в одном ответе. Google может помочь впрочем, достаточно хорошо.)
person
strangelydim
schedule
14.11.2009