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

Модератор: Модераторы
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 писал(а):я вообще-то хочу найти готовый менеджер, который написал человек который на этом деле уже собаку съел.
хотя если прижмёт то я не буду писать менеджер, а пойду и на дельфе 7-й сделаю.
поймите меня правильно, будет время напишу, а щас не буду рисковать.
Добавлено спустя 3 минуты 17 секунд:
cmem действительно ужасен
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.
Azeroth писал(а):от дельфы всё же отстаёт, fastmm быстрее
а тормоза возникают ещё и при частом вызове reallocmem, тут конечно можно и себя винить, но было бы здорово, если б реалок был поумнее.
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.
в дельфе такого нету, реаллок здесь немогуч
Предупреждение: используйте с предосторожностью - чрезмерное использование может фрагментировать память.
По моим тестам для современных Windows наилучшие показатели имеет самое простое решение на основе HeapAlloc. MM на его основе пишется за пол-часа.
Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4