Шустрый аллокатор
От: wander  
Дата: 21.09.19 22:57
Оценка:
Друзья,

а посоветуйте шустрый аллокатор.
Однопоточный,
без выравнивания,
кроссплатформенный.

Нужен для выделения буферов разного (но не больше двух-трех килобайт) размера.

Желательно, чтобы он не был частью какого-то огромного фреймворка.

Вот прежде чем велосипедить самому, решил спросить. Что-то в поиске ничего похожего не нашлось.

Спасибо.
Re: Шустрый аллокатор
От: Pzz Россия https://github.com/alexpevzner
Дата: 22.09.19 15:14
Оценка:
Здравствуйте, wander, Вы писали:

W>Нужен для выделения буферов разного (но не больше двух-трех килобайт) размера.


Аллокатор, который распоряжается блоками одинакового размера, может быть сделан ОЧЕНЬ быстрым.

Для многих проектов подходит такое решение: делаем все блоки аллокации равными по размеру самому большому блоку. Ну или, если памяти очень жалко, можно попробовать выбрать несколько (небольшое количество) ходовых размеров, и выделять подходящий из них.
Re[2]: Шустрый аллокатор
От: wander  
Дата: 22.09.19 16:04
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, wander, Вы писали:


W>>Нужен для выделения буферов разного (но не больше двух-трех килобайт) размера.


Pzz>Аллокатор, который распоряжается блоками одинакового размера, может быть сделан ОЧЕНЬ быстрым.


Pzz>Для многих проектов подходит такое решение: делаем все блоки аллокации равными по размеру самому большому блоку. Ну или, если памяти очень жалко, можно попробовать выбрать несколько (небольшое количество) ходовых размеров, и выделять подходящий из них.


Нужны блоки разного размера, грубо говоря о 30 байт до 1-2 килобайт.

Дополнительно напомню, что написать аллокатор самому не проблема. Пока что я спрашиваю про готовое решение.
Отредактировано 22.09.2019 16:06 wander . Предыдущая версия .
Re[3]: Шустрый аллокатор
От: Pzz Россия https://github.com/alexpevzner
Дата: 22.09.19 20:24
Оценка:
Здравствуйте, wander, Вы писали:

W>Нужны блоки разного размера, грубо говоря о 30 байт до 1-2 килобайт.


А точно ли нужны? 30 байт обычно влезает в 2 килобайта. Или у вас много маленьких аллокаций.

W>Дополнительно напомню, что написать аллокатор самому не проблема. Пока что я спрашиваю про готовое решение.


Это не ко мне.
Re[4]: Шустрый аллокатор
От: wander  
Дата: 22.09.19 21:34
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>А точно ли нужны? 30 байт обычно влезает в 2 килобайта. Или у вас много маленьких аллокаций.


Да. Много, и размер очередной аллокации нельзя предсказать.
Re: Шустрый аллокатор
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 23.09.19 00:55
Оценка: +2
Здравствуйте, wander, Вы писали:

W>Друзья,


W>а посоветуйте шустрый аллокатор.

W>Однопоточный,
W>без выравнивания,
W>кроссплатформенный.

Привет, а не подскажете как пришли к мнению о том, что нужен собственный аллокатор? Какие-то тесты, теоретические размышления или ещё что-то? Не пытаюсь сказать что он вам не нужен, скорее интересны причины поиска.
Re: Шустрый аллокатор
От: Masterspline  
Дата: 23.09.19 05:20
Оценка:
Поддержу Капитона. Ты уже пробовал какой-нибудь jemalloc и он тебе не подошел?

Не понятно из каких соображений выбирается аллокатор. Хочется, чтобы их озвучили. "Хочу что-то быстрее стандартного" — звучит не убедительно. А для меня jemalloc очень даже стандартный и я очень сомневаюсь, что можно сделать в реальной задаче что-то быстрее.
Re[2]: Шустрый аллокатор
От: wander  
Дата: 23.09.19 09:45
Оценка:
Здравствуйте, Masterspline, Вы писали:

M>Не понятно из каких соображений выбирается аллокатор. Хочется, чтобы их озвучили.

Я их озвучил в стартовом посте. В любом general purpose аллокаторе (и в jemalloc тоже) поддерживается многопоточность и выравнивание адресов выдаваемых порций памяти. Мне это все не нужно. Собственно уже только лишь за счет этого можно ждать ускорения.
Re[2]: Шустрый аллокатор
От: wander  
Дата: 23.09.19 10:00
Оценка: 24 (2)
Здравствуйте, kaa.python, Вы писали:

KP>скорее интересны причины поиска.


Это совершенно ни разу не desktop-приложение.

Хочу дать больше простора для маневра вышележащим системам, чтобы они могли легче укладываться в наши временные нормативы. Поэтому после алгоритмической оптимизации, взялся за низкоуровневую. Железо у нас фиксированное.
В общем посмотрел профайлером, оказалось, что много времени тратится на синхронизацию, также у меня не нужно выравнивать адреса выдаваемых блоков памяти.

Я вполне в состоянии написать подобный аллокатор самостоятельно, но сперва решил поискать что-то готовое.
Re[3]: Шустрый аллокатор
От: chaotic-kotik  
Дата: 23.09.19 11:45
Оценка:
Здравствуйте, wander, Вы писали:

W>Я их озвучил в стартовом посте. В любом general purpose аллокаторе (и в jemalloc тоже) поддерживается многопоточность и выравнивание адресов выдаваемых порций памяти. Мне это все не нужно. Собственно уже только лишь за счет этого можно ждать ускорения.


jemalloc не выравнивает и он не синхронизирует, если ты в одном потоке выделяешь и удаляешь (у каждого потока кэш в TLS)
Re[4]: Шустрый аллокатор
От: wander  
Дата: 23.09.19 14:19
Оценка:
Здравствуйте, chaotic-kotik, Вы писали:

CK>jemalloc не выравнивает и он не синхронизирует, если ты в одном потоке выделяешь и удаляешь (у каждого потока кэш в TLS)


Если так, то это здорово. Однако похоже его все-таки надо настроить на, по крайней мере, работу без выравнивания,
потому что поведение по умолчанию требует, чтобы выравнивание было (иначе его нельзя было бы просто так использовать в качестве замены обычного malloc`а).

Попробую разобраться с этим подробнее. Спасибо.
Re: Шустрый аллокатор
От: AndrewJD США  
Дата: 23.09.19 14:53
Оценка: 4 (1)
Здравствуйте, wander, Вы писали:

W>а посоветуйте шустрый аллокатор.

W>Однопоточный,
W>без выравнивания,
W>кроссплатформенный.

Если С++17 не проблема, то стандатный std::pmr::unsynchronized_pool_resource должен быть достаточно хорош.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re: Шустрый аллокатор
От: c-smile Канада http://terrainformatica.com
Дата: 24.09.19 00:12
Оценка: 6 (1)
Здравствуйте, wander, Вы писали:

http://www.garret.ru/threadalloc/readme.html

http://www.garret.ru/threadalloc-106.zip
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.