Вот мой тест:
Выделение недолго живущих сферических "объектов" (а таких по статистике 90% в программах).
Средне статистический блок на 100 байт. Практически такой же тест как у вас, вид сбоку.
Код: Выделить всё
var
i,j,t :integer;
L:Array of Pointer;
P: Pointer;
begin
t := GetTickCount;
SetLength(L, 101);
for i := 0 to 10000 do
begin
for j := 0 to 100 do
begin
Getmem(P,100);
L[j] := P;
end;
for j := 0 to 100 do begin
ReAllocMem(L[j],200);
end;
for j := 0 to 100 do
begin
Freemem(L[j], 200);
end;
end;
ShowMessage(IntToStr(GetTickCount - t));
WindowsMM - 800 mlsec (ноликами не ошибся).
Родной FpcMM - 200 mlsec
FastMM - 125 mlsec
Есть разница? Правда это без LHF, как ее включить в XP я не в курсе, гугл что-то не может ничего внятного ответить. Если скажете как ее включить, проверю и с ней. Но вы представьте, как долго будет работать программа у более 50% пользователей, у которых не включен LHF.
Добавлено спустя 11 минут 2 секунды:А вот так если использовать пул, класс которого я приводил выше:
Результат - 50 mlsec, что быстрее FastMM в 2,5 раза, и работает с такой же скорость в Fpc.
Код: Выделить всё
var
L2: TOriAllocator;
I,T: Integer;
j :integer;
L:Array of Pointer;
P: Pointer;
begin
t := GetTickCount;
SetLength(L, 101);
L2 := TOriAllocator.Create(100, 10000);
for i := 0 to 10000 do
begin
for j := 0 to 100 do
begin
L[j] := L2.Alloc;
end;
for j := 0 to 100 do begin
ReAllocMem(L[j],200);
ReAllocMem(L[j],100);
end;
for j := 0 to 100 do
begin
L2.Dispose(L[j]);
end;
end;