powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Экстремально быстрый менеджер памяти BrainMM
25 сообщений из 1 129, страница 1 из 46
Экстремально быстрый менеджер памяти BrainMM
    #39231870
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проект на гитхабе: https://github.com/d-mozulyov/BrainMM
Скачать архивом: https://github.com/d-mozulyov/BrainMM/archive/master.zip


ПредисловиеНесколько лет назад я начал изучать алгоритмы сборки мусора и принципы менеджмента памяти в таких системах. Считается, что редкая дефрагментация и быстрое выделение памяти в конце пула - делают менеджеры памяти с принципом сборки мусора эффективнее традиционных подходов, когда выделение и освобождение памяти требует сложных медленных манипуляций. Однако на самом деле менеджеры памяти с принципом сборки мусора сложно назвать эффективными, потому что:
Realloc памяти гарантированно приводит к выделению нового куска памяти и копированию данных в него, что не обязательно происходит в менеджерах с традиционным подходом

Происходит перерасход памяти, т.к. в пуле содержатся так же ранее выделенные, но не используемые (освобождённые) куски памяти

Дефрагментация приводит к блокировке всех потоков, длительным операциям анализа и копирования данных - что нередко приводит к неприятному эффекту "зависания" приложения

Требуются дополнительные ресурсы на синхронизацию и обслуживание указателей, т.к. после дефрагментации данные могут находиться по другому физическому адресу

Принцип быстрого выделения памяти в конце пула за редким исключением применим и в традиционных менеджерах памяти

С другой стороны популярный менеджер памяти FastMM со временем перестаёт удовлетворять требованиям современных приложений, т.к. работает с блокировками на многопоточных приложениях, не содержит API для выровненных данных и расходует минимум, в зависимости от платформы, 8/16 байт служебной информации, даже на малых кусках памяти.


Поэтому я начал работу над проектом BrainMM - менеджером памяти, спроектированным под современные требования приложений. Искренне верю, что со временем проект вырастет до такого уровня, что войдёт в стандартную поставку Delphi/C++ Builder наряду с другими замечательными библиотеками. Для менеджера памяти BrainMM характерно следующее:

Экстремально высокая производительность

Без блокировок для кусков памяти до 32Кб

Поддержка всех операционных систем, предусмотренных в Delphi/C++ Builder

Разделяемая с DLL память

Гарантированно выровненный адрес на 16 байт. Это полезно для lock-free алгоритмов, SSE-команд и в целом при чтении/записи/копировании памяти

Функция RegetMem. По функциональности похожа на ReallocMem, но не гарантирует сохранности данных, поэтому в некоторых случаях может работать быстрее

Функция GetMemAligned. Позволяет выделить память с определённым выравниванием. Освобождается такая память стандартно по FreeMem. При изменении размера с помощью ReallocMem/RegetMem выравнивание сохраняется. Исключение составляют ситуации, когда NewSize равен нулю, в этом случае вызывается FreeMem и информация о выравнивании теряется

API для выделения блоков памяти. Под блоками памяти BrainMM подразумеваются куски памяти определённой гранулярности, чей размер изменить нельзя. Блоки памяти полезны для узкоспециализированного требовательного к производительности менеджмента памяти. Служебную информацию можно хранить в начале блока и получать доступ к ней, применяя к указателю операцию логического умножения. Менеджмент малыми (до 128 байт) и средними (до 32Кб) кусками памяти в BrainMM, например, осуществляется с помощью блоков размером 64Кб

API для работы со страницами памяти


Производительность

Данный тест был осуществлён на основе статьи Стива Моэна . Исходные коды теста находятся в репозитории, но Вы можете также скачать бинарные файлы .





Extended memory API
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
type
  TMemoryAlign = (ma16Bytes, ma32Bytes, ma64Bytes, ma128Bytes, ma256Bytes,
    ma512Bytes, ma1024Bytes, ma2048Bytes);
  PMemoryAlign = ^TMemoryAlign;

  MemoryBlock = type Pointer;
  PMemoryBlock = ^MemoryBlock;

  TMemoryBlockSize = (BLOCK_4K, BLOCK_16K, BLOCK_64K, BLOCK_256K,
    BLOCK_1MB, BLOCK_4MB, BLOCK_16MB, BLOCK_64MB, BLOCK_256MB);
  PMemoryBlockSize = ^TMemoryBlockSize;

  MemoryPages = type Pointer;
  PMemoryPages = ^MemoryPages;

  TMemoryAccessRight = (marRead, marWrite, marExecute);
  PMemoryAccessRight = ^TMemoryAccessRight;
  TMemoryAccessRights = set of TMemoryAccessRight;
  PMemoryAccessRights = ^TMemoryAccessRights;

  // additional memory functions
  procedure GetMemAligned(var P: Pointer; Align: TMemoryAlign; Size: NativeInt);
  procedure RegetMem(var P: Pointer; NewSize: NativeInt);

  // block routine
  procedure GetMemoryBlock(var Block: MemoryBlock; BlockSize: TMemoryBlockSize);
  procedure FreeMemoryBlock(Block: MemoryBlock);

  // 4kb-pages routine
  procedure GetMemoryPages(var Pages: MemoryPages; Count: NativeInt);
  procedure RegetMemoryPages(var Pages: MemoryPages; NewCount: NativeInt);
  procedure ReallocMemoryPages(var Pages: MemoryPages; NewCount: NativeInt);
  procedure FreeMemoryPages(Pages: MemoryPages);

  // any 4kb-aligned memory
  procedure ChangeMemoryAccessRights(Pages: MemoryPages; Count: NativeInt; Rights: TMemoryAccessRights);

  // fast SSE-based 16-aligned memory move
  procedure MoveB16Aligned(const Source; var Dest; const B16Count: NativeInt);

type
{ TJITHeap class }
{ Just-In-Time memory heap: READ | WRITE | EXECUTE }

  IJITHeap = interface
    procedure Clear;
    function GetMemory(Size: NativeInt): Pointer;
    procedure FreeMemory(P: Pointer);
    function SyncGetMemory(Size: NativeInt): Pointer;
    procedure SyncFreeMemory(P: Pointer);
  end;

  TJITHeap = class(TInterfacedObject, IJITHeap)
  public
    constructor Create;
    destructor Destroy; override;    
    procedure Clear;

    // memory management
    function GetMemory(Size: NativeInt): Pointer;
    procedure FreeMemory(P: Pointer);

    // synchronization (spin lock) + memory management
    function SyncGetMemory(Size: NativeInt): Pointer;
    procedure SyncFreeMemory(P: Pointer);
  end;

...
Рейтинг: 0 / 0
Экстремально быстрый менеджер памяти BrainMM
    #39231884
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Ты наконец-то занялся чем-то действительно полезным.
одобряю.
...
Рейтинг: 0 / 0
Экстремально быстрый менеджер памяти BrainMM
    #39231886
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

Быстрых менеджеров памяти полно. Промышленных парсеров текстов практически нет. По крайней мере с такой платформой, производительностью и поддержкой стольких кодировок.
...
Рейтинг: 0 / 0
Экстремально быстрый менеджер памяти BrainMM
    #39231890
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
сделай ещё супер-быстрый Jpeg кодер-декодер, будет вообще замечательно.
А то таскать с собой IJL15.DLL напрягает
...
Рейтинг: 0 / 0
Экстремально быстрый менеджер памяти BrainMM
    #39231896
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

Я ещё эти то не доделал. А ты уже про JPEG заговорил
...
Рейтинг: 0 / 0
Экстремально быстрый менеджер памяти BrainMM
    #39231904
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUdefecator,

Быстрых менеджеров памяти полно. Промышленных парсеров текстов практически нет. По крайней мере с такой платформой, производительностью и поддержкой стольких кодировок.

Вроде ж Янковский писал в теме про FixInsight, что реализовать его статический анализатор стало реально только после появления мощного парсера, не помню названия. Впрочем, хз как там с кодировками и мультиплатформенностью.
...
Рейтинг: 0 / 0
Экстремально быстрый менеджер памяти BrainMM
    #39231915
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В XE2 не компилируется. [DCC Error] BrainMM.pas(1887): E2003 Undeclared identifier: 'AtomicDecrement'
...
Рейтинг: 0 / 0
Экстремально быстрый менеджер памяти BrainMM
    #39231917
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Спасибо. Поправлю при следующих коммитах.
...
Рейтинг: 0 / 0
Экстремально быстрый менеджер памяти BrainMM
    #39231922
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0rВроде ж Янковский писал в теме про FixInsight, что реализовать его статический анализатор стало реально только после появления мощного парсера, не помню названия. Впрочем, хз как там с кодировками и мультиплатформенностью.
Этот парсер от самого Янковского -- DelphiAST . НО со скоростью там, наверное, что-то не до конца решено -- т.к. тот же FixInsight никак не осилит проверку в реальном времени (или близкое к этому).
...
Рейтинг: 0 / 0
Экстремально быстрый менеджер памяти BrainMM
    #39231928
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пара мегабайт исходников на мой взгляд - ещё не "промышленный" объём )
Я немного посмотрел его исходники... не особо они оптимизированны. Но и высокая производительность, насколько я понял из задачи, особо не нужна.
...
Рейтинг: 0 / 0
Экстремально быстрый менеджер памяти BrainMM
    #39231930
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiНО со скоростью там, наверное, что-то не до конца решено -- т.к. тот же FixInsight никак не осилит проверку в реальном времени (или близкое к этому).
А вот не нужно путать скорость парсинга со скоростью анализа.
...
Рейтинг: 0 / 0
Экстремально быстрый менеджер памяти BrainMM
    #39231932
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyА вот не нужно путать скорость парсинга со скоростью анализа.
Кстати, у анализатора нет исходников. Может там вообще RegExp'ом или XPath'ом идет анализ.
...
Рейтинг: 0 / 0
Экстремально быстрый менеджер памяти BrainMM
    #39231939
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiКстати, у анализатора нет исходников. Может там вообще RegExp'ом или XPath'ом идет анализ.
А надеюсь это шутка.
...
Рейтинг: 0 / 0
Экстремально быстрый менеджер памяти BrainMM
    #39231993
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверил на версии посвежее. Прогнал свои юнит тесты проходящие проверку на всех версиях дельфей и под всеми ОС. Результат - три теста упали с AV, тест производительности завис (т.е. он может что-то и делает т.к. проц жрёт, но я ждать устал) на массовом освобождении памяти.
...
Рейтинг: 0 / 0
Экстремально быстрый менеджер памяти BrainMM
    #39231995
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного деталей (один из стектрейсов):
Код: pascal
1.
2.
3.
4.
5.
BrainMM.NcMoveB16(???,???,???) // line 1337
BrainMM.BrainMMReallocMemoryPages($27E1000,???,???)
BrainMM.TThreadHeap.ReallocBigOrLarge($27E1000,1703248)
BrainMM.TThreadHeap.ReallocDifficult($27E1000,2,$40D7E7)
BrainMM.BrainMMReallocMem(???,???)
...
Рейтинг: 0 / 0
Экстремально быстрый менеджер памяти BrainMM
    #39231996
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверил два других - они все на этом месте падают.
...
Рейтинг: 0 / 0
Экстремально быстрый менеджер памяти BrainMM
    #39232101
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Поновее - это который development? Он ещё не готов, но информация в любом случае важная.
Добавляйся в скайп - будет что обсудить
...
Рейтинг: 0 / 0
Экстремально быстрый менеджер памяти BrainMM
    #39232220
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUДанный тест был осуществлёнпросьба добавить в соревнование tbbmm
и уточнить насчет нексуса, свежевышедшая ли версия?
...
Рейтинг: 0 / 0
Экстремально быстрый менеджер памяти BrainMM
    #39232230
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUПоновее - это который development?
Версия дельфей поновее, а менеджер из ветки master.
...
Рейтинг: 0 / 0
Экстремально быстрый менеджер памяти BrainMM
    #39232237
b0rk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А еще было бы интересно увидеть в сводной табличке преимущество в % над каждым из конкурентов.
...
Рейтинг: 0 / 0
Экстремально быстрый менеджер памяти BrainMM
    #39232438
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А для чего это вообще ?
Что бы TObject.Create был быстрее ?
...
Рейтинг: 0 / 0
Экстремально быстрый менеджер памяти BrainMM
    #39232441
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_B,

если для тебя работа с памятью заканчивается в районе создания\освобождения объектов - то не стоит и вникать в нестандартные менеджеры памяти.
...
Рейтинг: 0 / 0
Экстремально быстрый менеджер памяти BrainMM
    #39232476
Фотография Feg16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_BЧто бы TObject.Create был быстрее ?Чтобы сотня тысяч создаваемых и удаляемых объектов в замкнутом меньше раз роняло приложение. Например при сборе картинок с видеокамер :)
...
Рейтинг: 0 / 0
Экстремально быстрый менеджер памяти BrainMM
    #39232568
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Feg16,

Сбор картинок наверное сложный пример...
Изменения в существующий код надо вносить ?
Есть пример кода, где BrainMM выигрывает у стандартного манагера ?


Поддержу b0rk - насколько BrainMM получается быстрее ?
...
Рейтинг: 0 / 0
Экстремально быстрый менеджер памяти BrainMM
    #39232986
Фотография Feg16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не суть важно, давай софт, я верю что у тебя получится :)

ps. потом с тебя скидка :)
...
Рейтинг: 0 / 0
25 сообщений из 1 129, страница 1 из 46
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Экстремально быстрый менеджер памяти BrainMM
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]