IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

> Эффективность менеджера памяти в Delphi
TarasBer
сообщение 2.06.2010 11:02
Сообщение #1


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


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

{$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 (да и в других версиях, наверное, тоже) никакого смысла не имеют. Выходит, так?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 10.08.2025 2:27
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"