Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизПравильно ли сделан список? Найти похожие ветки
← →
Bluejohn (2012-05-24 22:31) [0]Нужно в списке хранить структуры.
Сделал такую минимальную обертку:
type
TListEx = class
constructor Create;
destructor Destroy; override;
protected
FItems: TList;
public
procedure Clear;
procedure Del(Idx: LongInt);
end;
PStruct = ^TStruct;
TStruct = record
N: LongInt;
A1: string;
M: boolean;
L: boolean;
A2: boolean;
end;
TStructList = class (TListEx)
public
procedure Add(O; TStruct);
end;
{ TListEx }
constructor TListEx.Create;
begin
inherited;
FItems:= TList.Create;
end;
destructor TListEx.Destroy;
begin
Clear;
FItems.Free;
inherited;
end;
procedure TListEx.Clear;
var
i: LongInt;
begin
For i:= FItems.Count - 1 downto 0 do
Del(i);
FItems.Clear;
end;
procedure TListEx.Del(Idx: Integer);
begin
Dispose(FItems[Idx]);
FItems.Delete(Idx);
end;
{ TStructList }
procedure TStructList.Add(O: TStruct);
var
P: PStruct;
begin
New(P);
P^:= O;
FItems.Add(P);
end;
Как правильно добавлять структуры в список?
Как удобнее сделать их использование?
← →
DVM © (2012-05-24 23:03) [1]может дженерики задействовать?
← →
DVM © (2012-05-24 23:06) [2]
> Как правильно добавлять структуры в список?
а что много вариантов есть?
← →
Германн © (2012-05-25 02:00) [3]
> Bluejohn (24.05.12 22:31)
>
> Нужно в списке хранить структуры.
Замени структуры на классы, используй TObjectList и не изобретай велосипед.
Имхо.
← →
Дмитрий С © (2012-05-25 02:27) [4]
> Как удобнее сделать их использование?
а как ты их собрался использовать то? Все от этого зависит. Может в твоем случае проще было бы array of TStruct сделать.
← →
KSergey © (2012-05-25 06:31) [5]> Германн © (25.05.12 02:00) [3]
> > Нужно в списке хранить структуры.
>
> Замени структуры на классы, используй TObjectList и не изобретай
> велосипед.
??!!
Размер строки, правда, неизвестен, но если небольшой - то размер каждой структуры опять же небольшой.
Ну а класс принесет с собой довольно заметный объем, на большом количестве элементов заметно очень.
Как-то расточительны вы, батенька ;)
PS
У нас программа в 2Гб давно не влезает :( в 3 - тоже. Впрочем, уже 5-й год какне влезает, каждый раз удается что-то придумать что пооптимайзить, но в новых фичах расточительство недопустимо.
← →
MBo © (2012-05-25 07:48) [6]>Ну а класс принесет с собой довольно заметный объем
Какой?
← →
sniknik © (2012-05-25 08:00) [7]> Ну а класс принесет с собой довольно заметный объем, на большом количестве элементов заметно очень
код не дублируется в памяти. т.е. сколько бы элементов не было, его объем останется такой же как у одного.
т.е. ровно такой же как для обработки рекордов, просто в другом месте (для рекордов код "внешний", для класса "внутренний").
← →
KSergey © (2012-05-25 08:08) [8]Я может отстал от жизни? Я про TObject знаю, который в TObjectList запихивается. Но может я что-то пропустил?
← →
MBo © (2012-05-25 13:20) [9]экземпляр класса
class TPointObject
private FX, FY: Integer;
методы
свойства
end;
займёт те же 8 байт, что и запись TPoint (+ некий объём кода и таблиц, общий для всех экземпляров данного класса)
← →
KSergey © (2012-05-25 15:35) [10]> MBo © (25.05.12 13:20) [9]
> экземпляр класса
>
> class TPointObject
B Free для него позвать можно?
← →
Romkin © (2012-05-25 15:48) [11]
> экземпляр классаclass TPointObject private FX, FY: Integer;
> методы свойстваend;займёт те же 8 байт, что и запись
> TPoint (+ некий объём кода и таблиц, общий для всех экземпляров
> данного класса)
Ошибаешься. Не меньше 12, у меня 16.
← →
MBo © (2012-05-25 16:18) [12]Мда, виноват, соврамши.
Ведьв объекте есть указатель на сам класс .
← →
Медвежонок Пятачок © (2012-05-25 17:46) [13]мда..... как все сложно.
структура, конструктор, деструктор, очищатор, удалятор, добавлятор....
не хватает еще поискатора и сериализатора с десериализатором (загружатором).
возьмите же вы xmldom и все будет на каемочке с блюдечком.
← →
DVM © (2012-05-25 23:07) [14]
> возьмите же вы xmldom и все будет на каемочке с блюдечком.
Ты действительно не понимаешь или прикидываешься, но xml уместен не всегда и не везде, по крайней мере его текстовый вариант.
← →
Медвежонок Пятачок © (2012-05-26 08:24) [15]речь не про везде а про здесь.
здесь-то он чем неуместен?
тем, что избавит всех от кучи лишнего говнокода, который так привычно и столь приятно писать?
← →
DVM © (2012-05-26 09:31) [16]
> Медвежонок Пятачок © (26.05.12 08:24) [15]
> здесь-то он чем неуместен?
Имхо явной избыточностью.
> тем, что избавит всех от кучи лишнего говнокода, который
> так привычно и столь приятно писать?
Давно уже никто не пишет.
List: TList<TStruct > вот и вся писанина.
← →
Медвежонок Пятачок © (2012-05-26 12:14) [17]ага ага, вся.
см [13]
← →
DVM © (2012-05-26 13:13) [18]
> Медвежонок Пятачок © (26.05.12 12:14) [17]
> ага ага, вся.
в 13 написаны твои личные фантазии на тему, чего еще автору не надо.
> речь не про везде а про здесь.
вот именно здесь есть только удаление и добавление, очистка, в случае с дженериками не требующая ни строчки дополнительного кода.
← →
DVM © (2012-05-26 13:16) [19]
> Медвежонок Пятачок © (26.05.12 12:14) [17]
кстати про писанину, если использовать XML писанины в данном конкретном случае будет не меньше, а даже больше.
← →
TUser © (2012-05-26 13:56) [20]При создании объекта (см исходники VCL) выполняется довольно значительный код (NewInstance), помимо выеления памяти. Можно попробовать измерять время работы вот этого кода будильником - разница хорошо заметна.
procedure TForm1.Button1Click(Sender: TObject);
var o: TObject;
type
tp = record end;
pp = ^tp;
var p: pp;
var i: longint;
begin
for i := 0 to 100000000 do begin
o := TObject.Create;
o.Free;
end;
ShowMessage ("1");
for i := 0 to 100000000 do begin
p := new (pp);
Dispose (p);
end;
ShowMessage ("2");
end;
зы. Это про Д7.
← →
Bluejohn (2012-05-26 14:49) [21]Нужен список для именно для структур.
> Может в твоем случае проще было бы array of TStruct сделать.
Динамический массив быстрее чем TList?
> List: TList<TStruct > вот и вся писанина.
Нужно для Дельфи 7.
← →
Sapersky (2012-05-26 15:52) [22]Список для структур я как-то здесь выкладывал:
http://www.delphimaster.net/view/2-1246014742/18
Массивы - не обязательно быстрее (зависит от операции, от того, как её делать, от содержимого структуры, от менеджера памяти...), скорее проще.
http://sapersky.narod.ru/files/Arrays.rar
Содержимое массивов видно при отладке, а списков - нет (в старых Delphi, в BDS уже видно).
← →
Медвежонок Пятачок © (2012-05-26 16:37) [23].... а тем временем в замке шли вторые сутки мучительного выбора
← →
Loginov Dmitry © (2012-05-26 20:08) [24]
> destructor TListEx.Destroy;
> begin
> Clear;
> FItems.Free;
> inherited;
> end;
Сорри за оффтоп, в общем случае правильнее будет так:if Assigned(FItems) then
begin
Clear;
FItems.Free;
end;
Это на тот случай, если в конструкторе вдруг возникнет исключение (в данном случае она вряд ли возможно, но в другие случаях - может).
По теме: если данные не нужно сохранять в файлы или передавать в другие модули / по сети, то не вижу смысла связываться с RECORD и всякими New / Dispose. Проще создать класс и использовать Create / Free, тем более при Create все поля автоматически инициализируются (выставляются в ноль), а при вызове Free не важно какого класса объект и создан ли он вообще.
Насчет "затрат памяти", "ухудшения производительности" - это в 99% мелочи - удобство / простота / читабельность важнее.
← →
asail © (2012-05-26 21:21) [25]
> Bluejohn (26.05.12 14:49) [21]
Ты бы задачу-то огласил, а? Сколько рекордов, например, планируется? Одно дело, если их пара тысяч, и совсем другое, если их мульены...
А то народ копья тут ломает почем зря.
> Медвежонок Пятачок © (26.05.12 16:37) [23]
ХМЛ - это, конечно, замечательно... Но, если например, речь идет о рекордах, описывющих пиксели растровогo 20-мегапиксельного изображения, то не загнется ли тут dom?
← →
DVM © (2012-05-26 21:27) [26]
> asail © (26.05.12 21:21) [25]
> то не загнется ли тут dom?
Ну загнуться может и не загнется, но эффективным такое решение вряд ли можно назвать будет.
← →
Bluejohn (2012-05-27 00:30) [27]
> Ты бы задачу-то огласил, а?
Пару сотен.
← →
MBo © (2012-05-27 11:27) [28]TUser © (26.05.12 13:56) [20]
на XE твой код - разница 10 раз
код с TPoint и аналогичным объектом - 6 раз
Более приближенный к жизни код, в котором много (миллионы) объектов или записей инициализируется, лишь потом освобождается - разница в 3 раза.
На примере кода, в котором, помимо баловства с памятью, еще и полезная работа происходит - собственно, откуда у меня задача возникла - при появлении дженериков переводил на них AVL-дерево. Из-за недоделанности дженериков решил узел сделать не записью,а классом и протестировать, насколько производительность пострадает. Упала, но незначительно - на дереве с миллионом узлов, при интенсивном добавлении-поиске-удалении, - время изменилось не в разы, а на 10-20%.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.07 c