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

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

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

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

Сообщение Azeroth » 03.03.2011 22:40:59

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

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

Сообщение Mr.Smart » 03.03.2011 22:42:54

Есть менеджер cmem, а вообще можете свой написать :wink:
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение Azeroth » 03.03.2011 22:51:48

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

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

Сообщение devels » 03.03.2011 23:04:47

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;


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

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

Сообщение Azeroth » 03.03.2011 23:09:45

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

Добавлено спустя 3 минуты 17 секунд:
cmem действительно ужасен :(
Аватара пользователя
Azeroth
новенький
 
Сообщения: 14
Зарегистрирован: 13.05.2009 14:28:53

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

Сообщение devels » 03.03.2011 23:20:20

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

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


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

И вот почитайте: http://habrahabr.ru/blogs/htranslations/114739/
devels
постоялец
 
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

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

Сообщение coyot.rush » 03.03.2011 23:55:06

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гб, но реально он не будет выделен до тех пор пока его не заполнят данными
Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

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

Сообщение Sergei I. Gorelkin » 04.03.2011 00:32:44

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

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

Сообщение Azeroth » 04.03.2011 08:57:24

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

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

Сообщение devels » 04.03.2011 09:46:49

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


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

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

Сообщение Azeroth » 04.03.2011 15:21:08

сложно привести пример короткий и тормознутый одновременно :)
Код: Выделить всё
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.

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

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

Сообщение coyot.rush » 04.03.2011 22:28:37

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

Оптимизация использования 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
Предупреждение: используйте с предосторожностью - чрезмерное использование может фрагментировать память.
Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

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

Сообщение Max Rusov » 04.03.2011 23:52:42

По моим тестам для современных Windows наилучшие показатели имеет самое простое решение на основе HeapAlloc. MM на его основе пишется за пол-часа.
Max Rusov
постоялец
 
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

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

Сообщение Azeroth » 04.03.2011 23:57:27

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

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

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

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

Сообщение Max Rusov » 05.03.2011 00:02:06

Наверно, потому что он не кроссплатформенный. Я себе - сделал и давно использую.
Max Rusov
постоялец
 
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru