Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Экстремально быстрый менеджер памяти BrainMM / 25 сообщений из 1 129, страница 1 из 46
09.05.2016, 16:56:07
    #39231870
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экстремально быстрый менеджер памяти BrainMM
Проект на гитхабе: 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
09.05.2016, 17:29:38
    #39231884
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экстремально быстрый менеджер памяти BrainMM
Ты наконец-то занялся чем-то действительно полезным.
одобряю.
...
Рейтинг: 0 / 0
09.05.2016, 17:33:49
    #39231886
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экстремально быстрый менеджер памяти BrainMM
defecator,

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

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

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

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

Спасибо. Поправлю при следующих коммитах.
...
Рейтинг: 0 / 0
09.05.2016, 19:19:35
    #39231922
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экстремально быстрый менеджер памяти BrainMM
Vizit0rВроде ж Янковский писал в теме про FixInsight, что реализовать его статический анализатор стало реально только после появления мощного парсера, не помню названия. Впрочем, хз как там с кодировками и мультиплатформенностью.
Этот парсер от самого Янковского -- DelphiAST . НО со скоростью там, наверное, что-то не до конца решено -- т.к. тот же FixInsight никак не осилит проверку в реальном времени (или близкое к этому).
...
Рейтинг: 0 / 0
09.05.2016, 19:36:19
    #39231928
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экстремально быстрый менеджер памяти BrainMM
Пара мегабайт исходников на мой взгляд - ещё не "промышленный" объём )
Я немного посмотрел его исходники... не особо они оптимизированны. Но и высокая производительность, насколько я понял из задачи, особо не нужна.
...
Рейтинг: 0 / 0
09.05.2016, 19:37:53
    #39231930
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экстремально быстрый менеджер памяти BrainMM
JaDiНО со скоростью там, наверное, что-то не до конца решено -- т.к. тот же FixInsight никак не осилит проверку в реальном времени (или близкое к этому).
А вот не нужно путать скорость парсинга со скоростью анализа.
...
Рейтинг: 0 / 0
09.05.2016, 19:40:53
    #39231932
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экстремально быстрый менеджер памяти BrainMM
Kazantsev AlexeyА вот не нужно путать скорость парсинга со скоростью анализа.
Кстати, у анализатора нет исходников. Может там вообще RegExp'ом или XPath'ом идет анализ.
...
Рейтинг: 0 / 0
09.05.2016, 19:51:21
    #39231939
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экстремально быстрый менеджер памяти BrainMM
JaDiКстати, у анализатора нет исходников. Может там вообще RegExp'ом или XPath'ом идет анализ.
А надеюсь это шутка.
...
Рейтинг: 0 / 0
09.05.2016, 23:06:00
    #39231993
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экстремально быстрый менеджер памяти BrainMM
Проверил на версии посвежее. Прогнал свои юнит тесты проходящие проверку на всех версиях дельфей и под всеми ОС. Результат - три теста упали с AV, тест производительности завис (т.е. он может что-то и делает т.к. проц жрёт, но я ждать устал) на массовом освобождении памяти.
...
Рейтинг: 0 / 0
09.05.2016, 23:23:42
    #39231995
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экстремально быстрый менеджер памяти BrainMM
Немного деталей (один из стектрейсов):
Код: 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
09.05.2016, 23:25:58
    #39231996
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экстремально быстрый менеджер памяти BrainMM
Проверил два других - они все на этом месте падают.
...
Рейтинг: 0 / 0
10.05.2016, 09:43:16
    #39232101
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экстремально быстрый менеджер памяти BrainMM
Kazantsev Alexey,

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

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

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


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

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


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