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

Вниз

TList vs TList<T>   Найти похожие ветки 

 
Jeer ©   (2011-11-30 15:51) [0]

По мотивам, ху из круче :)

1. TList расширяется так и только при fCount = fCapacity, т.е. не при каждом *.Add:

procedure TList.Grow;
var
 Delta: Integer;
begin
 if FCapacity > 64 then
   Delta := FCapacity div 4
 else
   if FCapacity > 8 then
     Delta := 16
   else
     Delta := 4;
 SetCapacity(FCapacity + Delta);
end;

2. TList - это ни разу не динамический массив, а имеет свой аллокатор в raw-памяти без какой-либо инициализации аллокированного пространства.

**********************
TList<T> - имеет в себе динамический массив, что предопределяет вид аллокации.

Grow выполняется методом SetLength на 50% от текущей Capacity, т.е. более "жаден".

***********************

Делались практические замеры - TList выигрывает на Add().


 
Сергей М. ©   (2011-11-30 15:55) [1]


> TList выигрывает на Add().


Кому шашечки, кому ехать - на всех ведь не угодишь)

Ты это не в связи ли с топиком про ScaleMM2 ?


 
Jeer ©   (2011-11-30 15:59) [2]


> Сергей М. ©   (30.11.11 15:55) [1]


Не, мы с Ega23 увлеклись энтим обсуждением в
http://delphimaster.net/view/2-1322608424/

и не заметили, как нас прикрыли :)


 
Rouse_ ©   (2011-11-30 16:21) [3]

TList быстрее TList<T> примерно в 2 раза...


 
clickmaker ©   (2011-11-30 16:23) [4]

> TList быстрее TList<T> примерно в 2 раза

странно только то, что это вызывает какие-то сомнения )


 
Jeer ©   (2011-11-30 16:29) [5]


> clickmaker ©   (30.11.11 16:23) [4]
>
> > TList быстрее TList<T> примерно в 2 раза
>
> странно только то, что это вызывает какие-то сомнения )


Так я только отвечал Ega23, что сомнений быть не должно.
Опять Rouse_ недочеты ученика проморгал :).


 
Rouse_ ©   (2011-11-30 16:50) [6]

Вон Jack128 тут подсказывает что при правильно выставленном Capacity не в два, а минимум в 8 раз :)


 
Rouse_ ©   (2011-11-30 16:50) [7]


> Jeer ©   (30.11.11 16:29) [5]
> Опять Rouse_ недочеты ученика проморгал :).

Че эт ученика, Легыч сам по себе, он дженерики кстати лучше меня знает :)


 
Jeer ©   (2011-11-30 17:00) [8]


> Rouse_ ©   (30.11.11 16:50) [7]
> Че эт ученика, Легыч сам по себе,


Ну так, слегка "подцепил" :)


 
Ega23 ©   (2011-11-30 17:13) [9]


> Так я только отвечал Ega23, что сомнений быть не должно.
>
> Опять Rouse_ недочеты ученика проморгал :).


Ты кажется малость недопёр:

Jeer ©   (30.11.11 09:51) [8]

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

Ega23 ©   (30.11.11 10:37) [9]
Собственно, это и есть дин.массив, просто он в привате сидит и реаллок несколько иначе реализован.

Jeer ©   (30.11.11 11:58) [10]
Да.
+ медленнее за счет более "жадного" алгоритма реаллока.

Ega23 ©   (30.11.11 12:05) [11]
Наоборот, быстрее. Прирост размера 25% сразу. Но - по одному разу, а не на каждой итерации SetLength делать.

Я вообще-то про дин.массив vs. TList<T> при заранее неизвестном размере.
Приращение на 25% - согласен, это я с TList спутал.


 
Dennis I. Komarov ©   (2011-11-30 17:14) [10]


> Вон Jack128 тут подсказывает

Да у вас там банда :)


 
DVM ©   (2011-11-30 17:37) [11]


> Jeer ©   (30.11.11 15:51) 


> 2. TList - это ни разу не динамический массив, а имеет свой
> аллокатор в raw-памяти без какой-либо инициализации аллокированного
> пространства.

теперь уже динамический массив (XE2)

TPointerList = array of Pointer;

 TList = class(TObject)
 private
   FList: TPointerList;
   FCount: Integer;


 
Dennis I. Komarov ©   (2011-11-30 17:39) [12]

ARec = record
 a:
 s:
 d:
end;
G = TList<ARec>;

AClass = class(Object)
private
 FAny: G;
public
property A: G read FAny;
...
end;


Поправьте если не так понял:
Если раньше TList - список указателей и при удалении указателя из списка нужно было самому следить (освобождать) за памятью по этому указателю (PRec), то теперь указав TList<ARec> получаем список ARec-ов и уже с памятью делать ничего не нужно. TList<ARec>.Delete(Index) сам все сделает, Ровно как и TList<ARec>.Free


 
Dennis I. Komarov ©   (2011-11-30 17:57) [13]


> DVM ©   (30.11.11 17:37) [11]
> теперь уже динамический массив (XE2)
>
> TPointerList = array [...] of Pointer;
>
>  TList = class(TObject)
>  private
>    FList: PPointerList;

но сути не меняет... (D2010)


 
Jeer ©   (2011-11-30 18:25) [14]


> теперь уже динамический массив (XE2)
>


"Ну только отвлечешься, опять все испортят" (С)



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

Текущий архив: 2012.03.25;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.008 c
15-1322521917
Vyacheslav
2011-11-29 03:11
2012.03.25
TListBox и DragDrop файлов из проводника


15-1322425802
Юрий
2011-11-28 00:30
2012.03.25
С днем рождения ! 28 ноября 2011 понедельник


2-1323115734
Германн
2011-12-06 00:08
2012.03.25
БД Firebird &amp; Delphi


2-1323635690
Bobermaner
2011-12-12 00:34
2012.03.25
Работа с COM-портом.


1-1289684800
antonn
2010-11-14 00:46
2012.03.25
Как отловить нажатие VK_SNAPSHOT?