Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.067 c
4-1258675071
DDorgNev
2009-11-20 02:57
2013.03.22
как перехватить LVM_SETITEMTEXT у контрола в чужом окне?


6-1264661596
Separator
2010-01-28 09:53
2013.03.22
Проблема с gethostbyname


10-1181731675
tsndamir
2007-06-13 14:47
2013.03.22
Add-In


15-1330882741
alexdn
2012-03-04 21:39
2013.03.22
Выборы 2012


2-1335425564
jacksotnik
2012-04-26 11:32
2013.03.22
TreeView &amp; Checkbox





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский