Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2012.03.25;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.003 c
2-1323336084
Laguna
2011-12-08 13:21
2012.03.25
Почему не работает ParentFont ?


1-1273054167
Roman-555
2010-05-05 14:09
2012.03.25
Увеличение точности вычислений до 30-40 значащих цифр


6-1253728722
kluben-hh
2009-09-23 21:58
2012.03.25
Правильное соединение клиента с сервером


2-1323424929
webpauk
2011-12-09 14:02
2012.03.25
Динамический массив


15-1322570922
OW
2011-11-29 16:48
2012.03.25
Откуда пробел?





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