{$APPTYPE CONSOLE}
uses
Windows;
type
proc = procedure;
procedure Stress; // думаю, достаточно интересная задача для менеджера памяти
var
p1, p2, p3, p4: array of byte;
i: integer;
begin
for i := 0 to 999999 do begin
SetLength(p1, i);
SetLength(p2, i);
SetLength(p3, i);
SetLength(p4, i);
end;
end;
procedure Test(p: proc);
var
T: cardinal;
begin
T := GetTickCount; while T = GetTickCount do; T := GetTickCount;
p;
WriteLn(integer(GetTickCount) - integer(T));
end;
function MyReallocMem(p: Pointer; size: Integer): Pointer; // äîïîëíèòü äî ñòåïåíè 2
var
aSize: integer;
begin
if size = 0 then aSize := 0 else begin
aSize := 1;
while aSize < size do aSize := aSize shl 1;
end;
Result := SysReallocMem(p, size);
end;
var
M: TMemoryManager;
begin
Test(Stress);
M.GetMem := SysGetMem;
M.FreeMem := SysFreeMem;
M.ReAllocMem := MyReAllocMem;
SetMemoryManager(M);
Test(Stress);
ReadLn;
end.
Программа вывела вот что (на современном компе):
Код
1031
1297
Я сделал такой вывод - при работе с динамическими массивами можно не заморачиваться и увеличивать длину по единичке, всё реализовано достаточно эффективно, советы дополнять до степени 2 в D7 (да и в других версиях, наверное, тоже) никакого смысла не имеют. Выходит, так?