Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.06.02;
Скачать: [xml.tar.bz2];

Вниз

Зачем delphi свой менеджер памяти?   Найти похожие ветки 

 
Дмитрий С ©   (2013-01-22 10:55) [0]

Чем тот что windows предоставляет не подходит?


 
Romkin ©   (2013-01-22 11:01) [1]

О каком именно из тех, что предоставляет Windows ты говоришь? :)


 
clickmaker ©   (2013-01-22 11:22) [2]

Для оптимизации при выделении памяти в куче под небольшие объекты (классы, строки, дин. массивы)


 
Rouse_ ©   (2013-01-22 11:31) [3]

Какой именно Менеджер памяти предоставляет Windows?


 
Пит   (2013-01-22 11:31) [4]

Дмитрий С, ну ты даешь старик!

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


 
Inovet ©   (2013-01-22 12:33) [5]

Вот мгтересно, что будет, если каждый оаз запрашивать память у системы на все тысячи мелких объектов.


 
jack128 ©   (2013-01-22 13:58) [6]


> Вот мгтересно, что будет, если каждый оаз запрашивать память
> у системы на все тысячи мелких объектов.

зависит от того, как именно запрашивать эту память, ибо см [1].


 
jack128 ©   (2013-01-22 13:59) [7]


> Ведь именно дельфи знает о своих типах данных и как их грамотно
> размещать в памяти.

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


 
Дмитрий С ©   (2013-01-22 14:40) [8]

Я может неправильно выразился громким словом "Менеджер памяти".
По-умолчанию, delphi использует функцию SysGetMem для выделения памяти. Почему нельзя было просто использовать HeapAlloc или VirtualAlloc или типа того вместо нее?


 
Дмитрий С ©   (2013-01-22 14:42) [9]


> Ведь именно дельфи знает о своих типах данных и как их грамотно
> размещать в памяти.

Если честно, то у меня сомнения, что Delphi это сделает лучше чем Windows.


 
RWolf ©   (2013-01-22 14:50) [10]

если я правильно помню, в FastMem есть режим работы с динамической памятью через WinAPI; используется для отладки и отличается крайней неторопливостью.


 
Rouse_ ©   (2013-01-22 14:51) [11]

SysGetMem использует VirtualAlloc для выделения большого куска памяти, а потом оперирует этой выделенной памятью. Т.е. реальных реалоков не происходит (с условием что выделеной памяти достаточно) а сталобыть и тормозов связаных с выделением и реалокированием нет.


 
Игорь Шевченко ©   (2013-01-22 14:59) [12]

Зачем Delphi использует свой - потому что быстрее


 
брат Птибурдукова   (2013-01-22 15:18) [13]


> Дмитрий С ©   (22.01.13 14:40) [8]
слово "гранулярность" о чём-то говорит?


 
Пит   (2013-01-22 15:20) [14]


> менеджер памяти не знает ничего о тех типах, которые будут
> размещаться в той памяти, которую он (менеджер) выделяет.
>

Жень, а ты в этом уверен?
Никакой оптимизации никогда не происходит в соответствии о знании специфики?

Тогда я согласен с:


> Если честно, то у меня сомнения, что Delphi это сделает
> лучше чем Windows.

неужто вы все согласны, что разработчики Дельфи на порядок талантливее, чем разработчики Windows?

Вы говорите о прогнозировании действий, что менеджер памяти понимает, что в дальнейшем также еще будет требоваться выделить место, о повторном использовании кусков памяти и так далее, но что, разве менеджер памяти windows этого не понимает?

С чего это вдруг менеджер памяти дельфи окажется быстрее виндового, за счет каких алгоритмов то?

Если они оба оперируют исключительно одними понятиями и входные данные всегда ДайПамяти(<СтолькоВотБайт>) в одни и те же моменты времени, то как раз менеджер памяти Windows должен уделывать Delphi, по крайней мере быть не хуже.


 
брат Птибурдукова   (2013-01-22 15:26) [15]


> Пит   (22.01.13 15:20) [14]
[13] и Руссиновича читал? :-)


 
jack128 ©   (2013-01-22 15:28) [16]


> Почему нельзя было просто использовать HeapAlloc или VirtualAlloc
> или типа того вместо нее?

ну как Игорь сказал дельфийский менеджер памяти побыстрее будет.
Но надо сказать, что сишный рантайм от MS использует HeapAlloc напрямую. Вроде как в win2k его(HeapXXX) переписали и он стал весь из себя жутко быстрый.


 
Anatoly Podgoretsky ©   (2013-01-22 15:32) [17]

Есть несколько менеджеров памяти в ДЕЛЬФИ и все они различаются скоростью. При том победителя нет.


 
Дмитрий С ©   (2013-01-22 15:47) [18]


> Anatoly Podgoretsky ©   (22.01.13 15:32) [17]
>
> Есть несколько менеджеров памяти в ДЕЛЬФИ и все они различаются
> скоростью. При том победителя нет.

А готовые тесты для этого есть?

Написал небольшой модуль, может кто потестит скорость?


unit MyMem;

interface
implementation

type
 DWORD = Cardinal;
 BOOL = LongBool;

const
 kernel32  = "kernel32.dll";
 HEAP_ZERO_MEMORY = $00000008;

function HeapAlloc(hHeap: THandle; dwFlags, dwBytes: DWORD): Pointer; stdcall; external kernel32 name "HeapAlloc";
function HeapFree(hHeap: THandle; dwFlags: DWORD; lpMem: Pointer): BOOL; stdcall; external kernel32 name "HeapFree";
function HeapReAlloc(hHeap: THandle; dwFlags: DWORD; lpMem: Pointer; dwBytes: DWORD): Pointer; stdcall; external kernel32 name "HeapReAlloc";
function GetProcessHeap: THandle; stdcall; external kernel32 name "GetProcessHeap";

var
 Heap: THandle;

function GetMem(Size: Integer): Pointer;
begin
 Result := HeapAlloc(Heap, 0, Size);
end;

function FreeMem(P: Pointer): Integer;
begin
 if P <> nil then
   HeapFree(Heap, 0, P);
 Result := 0;
end;

function AllocMem(Size: Cardinal): Pointer;
begin
 Result := HeapAlloc(Heap, HEAP_ZERO_MEMORY, Size);
end;

function ReAllocMem(P: Pointer; Size: Integer): Pointer;
begin
 Result := HeapReAlloc(Heap, HEAP_ZERO_MEMORY, P, Size);
end;

function RegisterExpectedMemoryLeak(P: Pointer): Boolean;
begin
 Result := True;
end;

function UnRegisterExpectedMemoryLeak(P: Pointer): Boolean;
begin
 Result := True;
end;

var
 MM: TMemoryManagerEx = (
   GetMem: GetMem;
   FreeMem: FreeMem;
   ReallocMem: ReAllocMem;
   AllocMem: AllocMem;
   RegisterExpectedMemoryLeak: RegisterExpectedMemoryLeak;
   UnregisterExpectedMemoryLeak: UnRegisterExpectedMemoryLeak
 );
 OldMM: TMemoryManagerEx;

initialization
 Heap := GetProcessHeap;
 GetMemoryManager(OldMM);
 SetMemoryManager(MM);
finalization
 SetMemoryManager(OldMM);
end.



 
Eraser ©   (2013-01-22 16:17) [19]


> Дмитрий С ©   (22.01.13 15:47) [18]

такой тест про оптимальность ничего не скажет. тестирование менеджера памяти - весьма нетривиальная задача.

> Если честно, то у меня сомнения, что Delphi это сделает
> лучше чем Windows.

доля правды в этом есть, нынче уже не win9x и даже не XP. начиная с висты, в ОС кардинально переделали работу с памятью.


 
Сергей М. ©   (2013-01-22 16:21) [20]


> С чего это вдруг менеджер памяти дельфи окажется быстрее
> виндового, за счет каких алгоритмов то?
>


Подозреваю что как минимум за счет использования мьютексов виндовым хип-менеджером в режиме HEAP_NO_SERIALIZE = False.
Стандартный дельфийский менджер в режиме IsMultithreading = True использует крит.секцию.
Обращения к КС существенно быстрее чем к мьютексам.


 
Пит   (2013-01-22 16:58) [21]


> Обращения к КС существенно быстрее чем к мьютексам.



> ну как Игорь сказал дельфийский менеджер памяти побыстрее
> будет.
> Но надо сказать, что сишный рантайм от MS использует HeapAlloc
> напрямую. Вроде как в win2k его(HeapXXX) переписали и он
> стал весь из себя жутко быстрый.

то есть, сведения о том, что дельфийский менеджер быстрее относятся к системам до win2k? )))
А где такие еще стоят и кто на них ориентируется еще?

Блин, тока Розыч бы сча не вылез со своей критикой что ой как много клиентов на win9x сейчас у гранда)

То есть, на системах которые были выпущены последние лет 12-13 уже не факт кто быстрее?


> Обращения к КС существенно быстрее чем к мьютексам.

а почему тогда виндовый менеджер не использует секции?
И опять же - не относятся твои сведения как тут выясняется к системам 15-ти летней давности?


 
Eraser ©   (2013-01-22 17:01) [22]


> Пит   (22.01.13 16:58) [21]


> а почему тогда виндовый менеджер не использует секции?

потому что крит. секцию можно использовать только в рамках одного процесса.


 
Игорь Шевченко ©   (2013-01-22 17:01) [23]


> Но надо сказать, что сишный рантайм от MS использует HeapAlloc
> напрямую


вместо malloc ?


 
jack128 ©   (2013-01-22 17:09) [24]


> Стандартный дельфийский менджер в режиме IsMultithreading
> = True использует крит.секцию.

стандартный менеджер памяти в д2010 не использует крит.секции. Он просто выставляет флажок лока через lock cmpxchg, а если натыкается на конфликт, то ждет sleep"ом.


 
clickmaker ©   (2013-01-22 17:09) [25]

> > Но надо сказать, что сишный рантайм от MS использует HeapAlloc
>
> > напрямую
>
>
> вместо malloc ?

malloc - обертка для HeapAlloc


 
Дмитрий С ©   (2013-01-22 17:13) [26]


> потому что крит. секцию можно использовать только в рамках
> одного процесса.

А с кучей можно из разных процессов работать?


 
jack128 ©   (2013-01-22 17:13) [27]


> вместо malloc ?

malloc реализуется через HeapAlloc. вот тут http://www.rsdn.ru/forum/cpp/1769838.1  народ кусками кода бросается.


 
Сергей М. ©   (2013-01-22 17:18) [28]


> не относятся твои сведения как тут выясняется к системам
> 15-ти летней давности?


msdn гласит что хип-менеджер стал доступен начиная с XP

А насчет мьютексов могу и ошибаться, если трактовать "в лоб"

If HEAP_NO_SERIALIZE is not specified (the simple default), the heap serializes access within the calling process. Serialization ensures mutual exclusion when two or more threads attempt simultaneously to allocate or free blocks from the same heap


Хотя в комментах к HeapLock/Unlock явно упоминается крит.секция.


 
clickmaker ©   (2013-01-22 17:22) [29]

Вряд ли там мьютексы. Речь ведь идет о доступе из разных потоков, а не процессов, within the calling process


 
Сергей М. ©   (2013-01-22 17:23) [30]


> jack128 ©   (22.01.13 17:09) [24]


Ну а lock cmpxchg еще шустрей.


 
Игорь Шевченко ©   (2013-01-22 17:24) [31]


> msdn гласит что хип-менеджер стал доступен начиная с XP


Рихтер в курсе ? А то в книге 96-года издания он про heap-функции пишет


 
Сергей М. ©   (2013-01-22 17:25) [32]


> clickmaker ©   (22.01.13 17:22) [29]


В любом случае, согласно msgn, виндовых хипов попросту не было во времена Win9x/Me.


 
Сергей М. ©   (2013-01-22 17:27) [33]


> Игорь Шевченко ©   (22.01.13 17:24) [31]


Понятия не имею.

Вижу это:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366569%28v=vs.85%29.aspx


 
Игорь Шевченко ©   (2013-01-22 17:28) [34]

jack128 ©   (22.01.13 17:13) [27]

в Delphi GetMem реализован через VirtualAlloc. Куском кода со [skipped] бросить ?


 
Игорь Шевченко ©   (2013-01-22 17:32) [35]


> В любом случае, согласно msgn, виндовых хипов попросту не
> было во времена Win9x/Me.


Не верь, хозяин, этому Константинопольскому ходже. В Windows 95 kernel32.dll экспортирует Heap-функции


 
clickmaker ©   (2013-01-22 17:32) [36]

> [32] Сергей М. ©   (22.01.13 17:25)

Это у MS политика такая: все, что устарело и не поддерживается - того как бы и не было. Стерто из памяти людской и из истории. А "кучные" функции появились еще в вин 95


 
Игорь Шевченко ©   (2013-01-22 17:35) [37]

clickmaker ©   (22.01.13 17:32) [36]

"таймс 03.12.83 минусминус изложен наказ с. б. упомянуты нелица переписать сквозь наверх до подшивки"


 
Сергей М. ©   (2013-01-22 17:50) [38]


> Игорь Шевченко ©   (22.01.13 17:32) [35]


> clickmaker ©   (22.01.13 17:32) [36]


Ну может быть, ворошить не буду)

Но тогда Борланду остается минимум одно оправдание незадействования хипов - прицел на будущую кроссплатформенность.

p.s.
Вот просто ради интереса бы глянуть - какой менеджер пользуют в устоявшихся версиях, скажем, OpenCV ? Он тоже верхом на malloc сидит ?  Что-то я сомневаюсь - там ведь тоже ориентация на быструю [ре]аллокацию большого кол-ва малоразмерных блоков, хотя дефрагментированность не критична ..
У кого есть под рукой исх-ки ?


 
Eraser ©   (2013-01-22 17:52) [39]


> Сергей М. ©   (22.01.13 17:50) [38]


> Но тогда Борланду остается минимум одно оправдание незадействования
> хипов - прицел на будущую кроссплатформенность.

она уже, в принципе, не будущая, а настоящая (см. FM). да и вызовы стандартного MM можно сделать просто обертками над системным.


 
Mystic ©   (2013-01-22 18:02) [40]

Когда-то было проблемой, сейчас не знаю.

«Для компиляции FAR Manager использовался Borland C/C++ 5.02. MSVC 6 SP4 не оправдал ожиданий (FAR 1.70 beta 1) и добавил тормозов (работа с выделением памяти для мелких объектов)».

Евгения Рошаль, описание новых возможностей Far (версия 1.70 beta 2, сборка 321 от 16.12.2000).

В те времена Heap-функции не были заточены под работу с мелкими объектами. А для Delphi это было критично. Впрочем, примерно в Delphi 6-7 была возможность поставить свой менеджер памяти, и там, как вариант, можно было поставить вызовы Windows. Преимущества - такой менеджер памяти разделяем с DLL.



Страницы: 1 2 3 4 вся ветка

Форум: "Прочее";
Текущий архив: 2013.06.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.004 c
15-1359013803
Студент
2013-01-24 11:50
2013.06.02
Как подключать HDD?


15-1358856295
Пинта Виски
2013-01-22 16:04
2013.06.02
Изменить чарсет сервера (Oracle)


15-1359156796
Дмитрий С
2013-01-26 03:33
2013.06.02
как передается array of const?


2-1351936642
Очень Злой
2012-11-03 13:57
2013.06.02
Получить текст под мышкой из чужого окна


6-1222503093
Cryxalis
2008-09-27 12:11
2013.06.02
как заставить INDY юзать уже занятый порт?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский