Сейчас на форуме: asfa, Rio, _MBK_, Adler (+8 невидимых)

 eXeL@B —› Вопросы новичков —› Методика тестирования менеджера памяти
Посл.ответ Сообщение

Ранг: 129.7 (ветеран), 2thx
Активность: 0.070
Статус: Участник

Создано: 02 февраля 2013 12:16
· Личное сообщение · #1

Добрый день!

Пишу многопоточный проект на Delphi, число потоков >1000. Для обработки данных используются два типа блоков памяти - базовый блок фиксированного размера (64 байта) и расширенный блок переменного размера. Базовые блоки могут существовать сами по себе, расширенные только "в комплекте" с базовым. Возник интерес сравнить различные менеджеры памяти и выбрать лучший.

Требования к менеджеру памяти:
1. Максимально быстрое выделение и освобождение базовых блоков
2. Максимально быстрое (по возможности) выделение и освобождение расширенных блоков
3. Минимальная фрагментация памяти

Вопрос - по какой методике сравнивать менеджеры памяти? Есть ли какие-то стандарты?

Что приходит в голову:
1. Случайное выделение и освобождение базовых блоков в 1000 (для ровного счета в 1024) потоков. Контролировать рост памяти и время выделения/освобождения в начале и конце теста
2. То же самое с расширенными блоками
3. Выделить блоки размером 64 байта, освободить каждый второй, третий, четвертый. Затем выделить блоки по 128 байт, проконтролировать расход памяти

Может есть что-то еще?



Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 02 февраля 2013 16:51
· Личное сообщение · #2

Azur1d пишет:
1. Максимально быстрое выделение и освобождение базовых блоков
3. Минимальная фрагментация памяти

pool allocator. Самый эффективный аллокатор из возможных для фиксированных блоков. Сложность алгоритма O(1), фрагментация памяти отсутствует. Эффективно реализуется на x86/x64 на lock-free примитивах.

Azur1d пишет:
2. Максимально быстрое (по возможности) выделение и освобождение расширенных блоков

Если выделение и освобождение происходит всегда в одном потоке, заведи отдельную кучу для каждого потока. Если нет, сделать лучше стандартного heap врядли не получится.

P.S. рекомендую сразу отказаться от Delphi, сэкономишь много времени и нервов.

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 37.1 (посетитель), 11thx
Активность: 0.030
Статус: Участник

Создано: 03 февраля 2013 11:05 · Поправил: Promix_17
· Личное сообщение · #3

Я уж не знаю, но самое эффективное в этом случае - ограничить длину максимального блока исходя из условий задачи. Тогда, если нужно выделить память для расширенного блока, то мы всегда будем выделять больше памяти, чем нужно. Благодаря некоторому перерасходу памяти, получиться сделать очень быстрый менеджер памяти, не подверженный фрагментации. Просто два списка для свободных базовых и расширенных блоков и всё. При выделении берём из из списка, при освобождении добавляем в список. Сейчас сам пишу анологичное, только на чистом C.



Ранг: 129.7 (ветеран), 2thx
Активность: 0.070
Статус: Участник

Создано: 03 февраля 2013 12:08
· Личное сообщение · #4

Спасибо за комментарии. Сейчас у меня несколько пулов разного фиксированного размера от 8 байт до 4Кб, исходя из запроса выделяется нужный.
Вопрос немного в другом - как сравнить эффективность разных менеджеров памяти? Может я зря велосипед изобретаю




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 03 февраля 2013 14:12
· Личное сообщение · #5

скоростью отдачи блоков



Ранг: 129.7 (ветеран), 2thx
Активность: 0.070
Статус: Участник

Создано: 03 февраля 2013 21:29
· Личное сообщение · #6

Одной скоростью отдачи сыт не будешь. Программа их постоянно выделяет и освобождает




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 03 февраля 2013 21:36 · Поправил: reversecode
· Личное сообщение · #7

поставте для себя вопросы для чего пишутся альтернативные менеджеры памяти - и найдете нужные вам ответы

для себя я писал аллокатор, который уменьшал частоту обращения к malloc/free при очень частом обращении к созданию/удалению данных на мелких обьектах


 eXeL@B —› Вопросы новичков —› Методика тестирования менеджера памяти
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати