мемори-менеджер в fpc

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Аватара пользователя
Azeroth
новенький
Сообщения: 14
Зарегистрирован: 13.05.2009 14:28:53

мемори-менеджер в fpc

Сообщение Azeroth »

Знающие люди, скажите, есть ли какие замены менеджера памяти для ртл фрипаскаля?
например кто-нибудь адаптировал fastmm к нему?
оказывается на некоторых задачах текущий менеджер памяти тормозит жутко, точнее когда много мелких выделений памяти происходит.
в инете я ничё такого не нашёл, но может кто знает такую тайну :)
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Есть менеджер cmem, а вообще можете свой написать :wink:
Аватара пользователя
Azeroth
новенький
Сообщения: 14
Зарегистрирован: 13.05.2009 14:28:53

Сообщение Azeroth »

свой как-нибудь потом, когда буду стар и мудр :)
а за наводку спасибо .
devels
постоялец
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

Сообщение devels »

CMem тормознутый, не сам по себе, а потому что неродной.

Вот посмотри, чтобы написать свой быстрый алокатор много ума не нужно:

Это пул, который кеширует выделенную память, за счет чего недолго живущие объекты создаются раз в 10 быстрее. Тоже самое можно и с объектами проделать.

http://code.google.com/p/orionphp/sourc ... _Alloc.pas

А вот пример использования:

Код: Выделить всё

 type
   PRecord = ^TRecord;
   TRecord = record
        prop: Integer;
   end;   

var
   Allocator: TOriAllocator;
   N: PRecord;
begin
   Allocator = TOriAllocator.Create(SizeOf(TRecord), 10000);

  for i := 0 ...
  begin
     N := Allocator.Alloc;
     N^.prop := 200;
     // уничтожаем так, тоже через аллокатор обязательно
     Allocator.Dispose(N);
  end;
end;


Можно усовершенствовать, ввести возможность, чтобы аллокатор мог оценивать сам, какой максимальный размер пула более оптимален в данный момент и мог сам решать, когда нужно немного почистить пул.
Аватара пользователя
Azeroth
новенький
Сообщения: 14
Зарегистрирован: 13.05.2009 14:28:53

Сообщение Azeroth »

я вообще-то хочу найти готовый менеджер, который написал человек который на этом деле уже собаку съел.
хотя если прижмёт то я не буду писать менеджер, а пойду и на дельфе 7-й сделаю.
поймите меня правильно, будет время напишу, а щас не буду рисковать.

Добавлено спустя 3 минуты 17 секунд:
cmem действительно ужасен :(
devels
постоялец
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

Сообщение devels »

Azeroth писал(а):я вообще-то хочу найти готовый менеджер, который написал человек который на этом деле уже собаку съел.
хотя если прижмёт то я не буду писать менеджер, а пойду и на дельфе 7-й сделаю.
поймите меня правильно, будет время напишу, а щас не буду рисковать.

Добавлено спустя 3 минуты 17 секунд:
cmem действительно ужасен :(


Ну вот в этом то и проблема, нет хорошего и быстрого менеджера сразу для всех задач, для каждой задачи лучше и быстрее определенный алгоритм. А для freepascal я еще не находил менеджеров памяти альтернативных. Я на этом собаку съел, потому что активно сверял скорость выполнения на delphi+fastmm и freepascal. Искал менеджеры для freepascal достаточно, но пока универсальных нет, кроме родного.

И вот почитайте: http://habrahabr.ru/blogs/htranslations/114739/
Аватара пользователя
coyot.rush
постоялец
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Сообщение coyot.rush »

VirtualAlloc http://msdn.microsoft.com/en-us/library/aa908768.aspx
flAllocationType

[in] Specifies the type of allocation.
MEM_COMMIT
Allocates physical storage in memory or in the paging file on disk for the specified region of pages.
An attempt to commit a committed page does not cause the function to fail. This means that a range of committed or decommitted pages can be committed without being concerned about a failure.
MEM_RESERVE
Reserves a range of the virtual address space of the process without allocating physical storage.
The reserved range cannot be used by any other allocation operations, such as the malloc and LocalAlloc functions, until it is released.
Reserved pages can be committed in subsequent calls to the VirtualAlloc function.
MEM_RESET
Not supported.
MEM_TOP_DOWN
Allocates memory at the highest possible address.
This flag is ignored in Windows Mobile.


Т.е. с помощью MEM_RESERVE можно зарезервировать скажем 1гб, но реально он не будет выделен до тех пор пока его не заполнят данными
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Тормоза в родном менеджере памяти возникают в случае, если память выделяется в одном потоке, а освобождается в другом. В остальном он написан весьма толково, и изобразить что-то в разы быстрее едва ли получится.
Аватара пользователя
Azeroth
новенький
Сообщения: 14
Зарегистрирован: 13.05.2009 14:28:53

Сообщение Azeroth »

от дельфы всё же отстаёт, fastmm быстрее
а тормоза возникают ещё и при частом вызове reallocmem, тут конечно можно и себя винить, но было бы здорово, если б реалок был поумнее.
devels
постоялец
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

Сообщение devels »

Azeroth писал(а):от дельфы всё же отстаёт, fastmm быстрее
а тормоза возникают ещё и при частом вызове reallocmem, тут конечно можно и себя винить, но было бы здорово, если б реалок был поумнее.


Приведите примерный код, можно будет хоть подсказать как оптимизировать под freepascal. И кстати надо ставить все опции оптимизации -O3 и т.п., это тоже реально влияет на скорость. И к тому же под отладкой freepascal бывает притормаживает ощутимо, у меня был случай что TFPList работал в 50 раз медленнее своего ребенка TList.
Аватара пользователя
Azeroth
новенький
Сообщения: 14
Зарегистрирован: 13.05.2009 14:28:53

Сообщение Azeroth »

сложно привести пример короткий и тормознутый одновременно :)

Код: Выделить всё

Var
  i : Integer;
  sa : pointer;
  dt:TDateTime;
begin
 l:=1;
  getmem(sa,4);
   dt:=Now;
   for i := 0 to 10000000 do
   begin
    integer(pointer(integer(sa)+i*4)^):=i;
    if (i mod 1000000)=0 then WriteLn((Now-dt):10:7,3);
    ReAllocMem(sa,(i+2)*4);
   end;

//   for i := 0 to {10000000}4 do
//     writeln(integer(pointer(integer(sa)+i*4)^));

  freemem(sa);
  readln;
end.

вот напрягся и написал, этот пример демонстрирует что куча во фрипаскале фрагментируется, если его запустить то видно что время между печатью растёт
в дельфе такого нету, реаллок здесь немогуч
Аватара пользователя
coyot.rush
постоялец
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Сообщение coyot.rush »

в дельфе такого нету, реаллок здесь немогуч

Оптимизация использования reallocmem http://www.farmanager.com/svn/trunk/enc/enc_rus/meta/articles/delphialloc.html
ReallocMem http://www.delphisources.ru/pages/faq/faq_delphi_basics/ReallocMem.php.html
Предупреждение: используйте с предосторожностью - чрезмерное использование может фрагментировать память.
Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

По моим тестам для современных Windows наилучшие показатели имеет самое простое решение на основе HeapAlloc. MM на его основе пишется за пол-часа.
Аватара пользователя
Azeroth
новенький
Сообщения: 14
Зарегистрирован: 13.05.2009 14:28:53

Сообщение Azeroth »

ну, собственно, ничё нового - оптимизировать можно, но нельзя достичь такого эффекта, какой был бы если бы менеджер памяти был скажем fastmm
потом могут быть случаи когда и оптимизировать не получится, например, если данные приходят хаотично, а запихать нужно в один контейнер
тот мой пример с фрагментацией работает на дельфе раз в 10 быстрее, то есть на порядок.
поэтому я и хочу Fastmm для fpc (в идеале) или что-то похожее

По моим тестам для современных Windows наилучшие показатели имеет самое простое решение на основе HeapAlloc. MM на его основе пишется за пол-часа.

мне ещё придется разбираться как правильно подменить его во фрипаскале, а если можно за пол-часа написать ММ лучше чем есть, почему это ещё не сделали ?
Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

Наверно, потому что он не кроссплатформенный. Я себе - сделал и давно использую.
Ответить