Текущий архив: 2005.09.25;
Скачать: CL | DM;
ВнизСвой менеджер памяти Найти похожие ветки
← →
Суслик © (2005-09-01 11:28) [0]Добрый день.
Помню, что несколько раз такие вопросы поднимались, но что-то не могу найти.
Задача.
Есть большое количество объектов одного класса. Полями объекта являются только простые типы (integer, double), т.е. никаких строк, интерфейсов и прочее.
Объектов много. Порядка млн. При этом они очень небольшие - от 4 до 30 байт полезной информации.
По результатам изменрений - стурктура из млн. объектов удаляется 1-2 сек.
Логичное желание оптимизировать алгоритмы создания/удаления объектов. Для этого логично использовать NewInstance и FreeInstance в сочетании с VirtualAlloc/VirtualFree.
В принципе могу и сам написать, но хотелось бы для начала изучить существующий материал.
Вопрос
Мог бы кто-нибудь поделиться наработками по заданной теме?
← →
Digitman © (2005-09-01 11:36) [1]
> оптимизировать алгоритмы создания/удаления объектов
не понял ...
к менеджменту памяти это какое имеет отношение ?
менеджер памяти заведует распределением/перераспределением/освобождением блоков памяти вне зависимости от того, кто и для каких целей обращается к нему с такими запросами
← →
Суслик © (2005-09-01 11:41) [2]
> [1] Digitman © (01.09.05 11:36)
нужен менеджер памяти для блоков одинаковой длины.
← →
begin...end © (2005-09-01 11:44) [3]> Суслик © (01.09.05 11:28)
> При этом они очень небольшие - от 4 до 30 байт полезной
> информации.
А почему в них разное количество полезной информации, если все они одного класса?
← →
КаПиБаРа © (2005-09-01 11:49) [4]Суслик © (01.09.05 11:41) [2]
Наверно вы это читали, но может еще кому сгодится
http://www.rsdn.ru/article/Delphi/memmanager.xml#EFBA
← →
Суслик © (2005-09-01 11:55) [5]
> А почему в них разное количество полезной информации, если
> все они одного класса?
Просто таких классов у меня несколько. И для каждого хочется сделать сабж.
Числа я привел для примера, что значений немного.
> [4] КаПиБаРа © (01.09.05 11:49)
Это то я, конечно читал. И код getmem.inc достаточно хорошо изучал.
Но думаю, что есть готовые решения именно под мою задачу.
← →
Digitman © (2005-09-01 11:56) [6]
> нужен менеджер памяти для блоков одинаковой длины
чем же такой менеджер будет принципиально отличаться от штатного менеджера по дифолту ?
представления о работе штатного менеджера имеешь ? исходники его изучал ?
← →
Суслик © (2005-09-01 11:58) [7]
> представления о работе штатного менеджера имеешь ? исходники
> его изучал ?
имею, изучал.
Отличаться будет тем, что будет заточен под мои требования и по дефолту будет быстрее работать.
← →
Digitman © (2005-09-01 12:00) [8]
> Суслик © (01.09.05 11:55) [5]
тебе придется перекроить чуть ли не всю Делфи.
← →
Digitman © (2005-09-01 12:02) [9]
> Суслик © (01.09.05 11:58) [7]
тогда тебе придется отказаться от штатного конструирования/разрушения объектов.
т.е. до свидания, методы TObject.Create/Destroy
← →
Суслик © (2005-09-01 12:11) [10]
> [9] Digitman © (01.09.05 12:02)
> т.е. до свидания, методы TObject.Create/Destroy
Вах! Почему. А NewInstance, FreeInstance?
← →
jack128 © (2005-09-01 12:21) [11]Насколько я помню у Alex Konshin"а (с) были наработки на эту тему..
← →
Суслик © (2005-09-01 12:21) [12]
> [11] jack128 © (01.09.05 12:21)
> Насколько я помню у Alex Konshin"а (с) были наработки на
> эту тему..
вот я его и жду :)
← →
Игорь Шевченко © (2005-09-01 12:32) [13]http://home.earthlink.net/~akonshin/delphi_ru.htm
← →
Digitman © (2005-09-01 12:40) [14]
> Суслик © (01.09.05 12:11) [10]
потому что New/FreeInstance в конечном итоге обращаются к Get/FreeMem.
А Get/FreeMem в конечном итоге обращаются по адресам, прописанным в глобальной MemoryManager-структуре.
← →
Суслик © (2005-09-01 12:49) [15]
> [14] Digitman © (01.09.05 12:40)
> New/FreeInstance
можно же перекрыть? Кто мешает.
Я в общем-то это уже делал. Располагал данные в статических массивах.
Но тут трудности с алгоритмами определения свободных ячеек, которые остались после удаления объектов. Т.е. определять то несложно, как сделать, чтобы быстро работало.
Да и к тому же количество объекто неизвестно. Поэтому их нужно располагать в динамической памяти. VirtualAlloc для этого хорошо подходит.
← →
КаПиБаРа © (2005-09-01 12:57) [16]Суслик © (01.09.05 12:49) [15]
Но тут трудности с алгоритмами определения свободных ячеек
2 ссвязных списка на одну область памяти. В одном занятые ячейки в другом - свободные. Ускорение за счет того что при удалении элементапамять не освобождается, а переходит в другой список.
← →
Digitman © (2005-09-01 13:21) [17]
> Суслик © (01.09.05 12:49) [15]
ты менеджер в составе msvctrt/msvcrXX не щупал ?
пощупай ..
Страницы: 1 вся ветка
Текущий архив: 2005.09.25;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.03 c