Единственный способ действительно сказать, какой распределитель памяти подходит для вашего приложения, это попробовать несколько. Все упомянутые распределители были написаны умными людьми и будут побеждать других в том или ином микробенчмарке. Если все ваше приложение в течение всего дня использует 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; реальная разница между ними заключается в степени настройки. Вы можете получить более высокую производительность, чем менее универсально, чем требуется ваш распределитель.
И, в зависимости от вашего варианта использования, многопоточный распределитель общего назначения может совсем не подходить вам; если вы постоянно используете malloc и освобождаете объекты одинакового размера, вы можете просто написать простой распределитель блоков. Распределение плиты используется в нескольких местах ядра Linux, которые соответствуют этому описанию. (Я бы дал вам еще пару полезных ссылок, но я «новый пользователь», и Stack Overflow решил, что новым пользователям не разрешено быть слишком полезными - все в одном ответе. Google может помочь все же достаточно хорошо.)