Это зависит от многих вещей, но в первую очередь:
- ОС
- Реализация
malloc
вы используете
ОСотвечает за выделение «виртуальной памяти», к которой имеет доступ ваш процесс, и создает таблицу перевода, которая отображает виртуальную память обратно на фактические адреса памяти.
Теперь реализация по умолчанию malloc
в целом консервативна, ибудет просто иметь гигантский замок вокруг всего этого.Это означает, что запросы обрабатываются последовательно, и единственное, что делает выделение из нескольких потоков вместо одного, это замедляет все это.
Существуют более умные схемы распределения, обычно основанные на пулах, и они могут бытьв других реализациях malloc
: tcmalloc
(от Google) и jemalloc
(используется Facebook) - две такие реализации, предназначенные для высокопроизводительной работы в многопоточных приложениях.
Серебряной пули неттем не менее, в какой-то момент ОС должна выполнить виртуальный <=> реальный перевод, который требует некоторой формы блокировки.
Лучше всего распределить по аренам:
- Распределить большиекуски (арены) сразу
- Разделите их на массивы соответствующего размера
Нет необходимости распараллеливать распределение арены, и вам лучше попроситьсамые большие арены, которые вы можете (имейте в виду, что запросы на выделение слишком большого количества могут потерпеть неудачу), тогда вы можете распараллелитьsplit.
tcmalloc
и jemalloc
могут немного помочь, однако они не предназначены для больших распределений (что необычно), и я не знаю, возможно ли настроитьразмер арен, которые они запрашивают.