Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Правильно ли сделан список?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.243 c
2-1335212783
vegarulez
2012-04-24 00:26
2013.03.22
[named pipes] Как?


15-1331152205
Юрий
2012-03-08 00:30
2013.03.22
С днем рождения ! 8 марта 2012 четверг


15-1349555402
Юрий
2012-10-07 00:30
2013.03.22
С днем рождения ! 7 октября 2012 воскресенье


6-1261579139
ZV
2009-12-23 17:38
2013.03.22
Client и Server. Как сделать надежно и просто ?


15-1341007816
vasa777
2012-06-30 02:10
2013.03.22
0-Core