![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как оптимальнее всего хранить список из пар число - строка?
NeyroSpace © (2004-12-14 09:50:00)Сабж
Anatoly Podgoretsky (2004-12-15 12:04:00) [1]Да и что бы не было попытки другой провокации, под списком имеется в виду именно TStringList, а не классический одно или двухсвязный списки.
И теперь если вертуься к вопросу, то он стоит так "Как оптимальнее всего хранить список из пар число - строка", то тут другой вопрос, что значит оптимальнее, какой именно критерий, если скорость перебора/доступа или размер в памяти то массив статический или динамический, если удобство манипулирования элементами, то TStringList, а если что то вообще другое, то это большой вопрос для телепатов.
Anatoly Podgoretsky (2004-12-15 11:59:00) [2]Семен Сорокин © (15.12.04 10:40) [21]
А провокация не получится, список реализован через динамический массив, является оберткой вокруг него!
Так что можешь использовать теже алгоритмы.
Семен Сорокин (2004-12-15 11:04:00) [3]
> Суслик © (15.12.04 10:46) [22]
> > ЗЫЫ. я тоже терпеть не могу динамические массивы :)
>
> Имхо зря. Для некоторых задач они очень удобны. Для хранения
> больших объемов данных, для которых предполагается активная
> обработка, они плохо подходят. А для хранения небольших
> списков неизвестной заранее длины очень даже.
Да понимаю что удобнее и быстрее, но всё равно через TList делаю - привычка :(
Суслик (2004-12-15 10:46:00) [4]
> [21] Семен Сорокин © (15.12.04 10:40)
> ЗЫ. оговорюсь, в сабже сказано именно хранить, а не работать,
> поэтому можно считать провокацией.
Согласен. Но форум на то и форум, что бы попутно узнать что-то новое.
> ЗЫЫ. я тоже терпеть не могу динамические массивы :)
Имхо зря. Для некоторых задач они очень удобны. Для хранения больших объемов данных, для которых предполагается активная обработка, они плохо подходят. А для хранения небольших списков неизвестной заранее длины очень даже.
Семен Сорокин (2004-12-15 10:40:00) [5]разогреем :))
а если вдруг понадобится :)) - отсортировать данные (а массиве, в листе), найти (в массиве, в листе), удалить из середины или начала (в массиве, листе)
ЗЫ. оговорюсь, в сабже сказано именно хранить, а не работать, поэтому можно считать провокацией.
ЗЫЫ. я тоже терпеть не могу динамические массивы :)
Суслик (2004-12-15 10:31:00) [6]
> [19] Anatoly Podgoretsky © (14.12.04 19:50)
ну ладно, ладно :)) Так будет быстрее всего. Не спорил.
Напомню, что обсуждал я с Акуличевым, что добавлять по одному элементу в ДМ накладно, а в SL - нет.
Anatoly Podgoretsky (2004-12-14 19:50:00) [7]Сказали же при одинаковых, а лучше наиболее оптимальным алгоритмом.
Теперь вот смени свой алгоритм так и снова измерь.
SetLength(da, cCount);
for i := 0 to cCount-1 do
begin
da[i].handle := random(cCount);
da[i].s := IntToStr(random(cCount));
end;
Иначе не красиво с твой стороны!
Аналогичный алгоритм можешь сделать и для TStringList
Суслик (2004-12-14 19:49:00) [8]А быстрее всего - реалиовать подход c capacity и count для dynarray. По времени добавляться будет одинаково. А вот доступ к элементам быстрее, т.к. не требуется вызов методов - доступ осущетствлятеся непосредственно к ячейкам памяти. См. cpu.
DiamondShark (2004-12-14 19:40:00) [9]Да, для 10000 по одному мы не будем использовать динмассив.
Убедил.
Суслик (2004-12-14 19:22:00) [10]Далее все растет по геометрической прогессии.
Судя по моим знаниям манагера памяти дельфи постоянно увеличивающиеся области памяти зачастую приводят к копированию данных. Поэтому получается n^2 операций.
StringLIst же - выделяет большими кусками. И потом помнит сам, сколько из них использует.
Суслик (2004-12-14 19:16:00) [11]
> При одинаковых алгоритмах, впереди будет ДМ
а ты проверь.
{$r-}
{$q-}
procedure TForm1.Button3Click(Sender: TObject);
const
cCount = 10000;
type
TRec = record
handle: Integer;
s: string[20];
end;
var
b, a, f: TLargeInteger;
l: TStringList;
da: array of TRec;
i: Integer;
begin
QueryPerformanceFrequency(f);
// Dyn arrays
da := nil;
QueryPerformanceCounter(b);
for i := 0 to cCount-1 do
begin
SetLength(da, Length(da)+1);
da[i].handle := random(cCount);
da[i].s := IntToStr(random(cCount));
end;
QueryPerformanceCounter(a);
ShowMessage(Format('%.4f', [(a-b)/f]));
// List
QueryPerformanceCounter(b);
l := TStringList.Create();
try
for i := 0 to cCount-1 do
begin
l.AddObject(IntToStr(random(cCount)), Pointer(random(cCount)));
end;
finally
l.Free();
end;
QueryPerformanceCounter(a);
ShowMessage(Format('%.4f', [(a-b)/f]));
end;
Anatoly Podgoretsky (2004-12-14 19:05:00) [12]При одинаковых алгоритмах, впереди будет ДМ
Суслик (2004-12-14 18:42:00) [13]
> Точно. А использование стринглист скажется хорошо.
Иронизируешь?
Ти реализацию stringlist смотрел? Например, на предмет подхода к использованию ReallocMem?
Можешь провети опыт: сравни добавление 10000 элементов по одному элементу в dyn array и в stringlist.
DiamondShark (2004-12-14 18:34:00) [14]
> Добавление в дин массив по 1 элементу через setlength плохо
> скажется на производительности
Точно. А использование стринглист скажется хорошо.
> Мой диагноз: для совета нужно знать сколько предполагается
> записей.
Товарищ сказал, что собирается хранить хэндлы файлов.
Если задача предусматривает хранение сотни-другой хэндлов файлов, то, в принципе, и использование стринглиста для из хранения уже не выглядит слишком экстравагантно.
;)
Суслик (2004-12-14 18:12:00) [15]
> [10] DiamondShark © (14.12.04 12:25)
а если таких записей будет много - тысяч 100000.
Добавление в дин массив по 1 элементу через setlength плохо скажется на производительности. Можно имитировать подход tlist с capacity и count, но это же надо делать...
Мой диагноз: для совета нужно знать сколько предполагается записей.
DiamondShark (2004-12-14 12:25:00) [16]
> Нужно хранить Handle - строка[20].
type
TData = record
H: THandle;
S: string[20];
end;
TDataList = array of TData;
стринглисты какие-то откуда-то взялись... бр-р...
NeyroSpace (2004-12-14 11:23:00) [17]>Leonid Troyanovsky © (14.12.04 11:05) [7]
На самом деле там будут хендлы файлов.
Семен Сорокин (2004-12-14 11:06:00) [18]
> strlist.Add('Some text');
> strlist.Objects[strlist.Count - 1] := Pointer(Form1.handle);
можно сразу
strlist.AddObject('Some text', TObject(Form1.handle));
Leonid Troyanovsky (2004-12-14 11:05:00) [19]
> NeyroSpace © (14.12.04 10:55) [6]
> Сделал следующим образом:
> procedure TForm1.FormCreate(Sender: TObject);
> begin
> form1.Caption := inttostr(form1.Handle);
Form1 использовать некошерно (Self.Handle, Handle).
--
Regards, LVT.
PS. Кстати, если это окна своего приложения,
то они уже есть - Screen.Forms[i].Handle
NeyroSpace (2004-12-14 10:55:00) [20]Leonid Troyanovsky © (14.12.04 10:19) [5]
Сделал следующим образом:
procedure TForm1.FormCreate(Sender: TObject);
begin
form1.Caption := inttostr(form1.Handle);
strlist := TStringList.Create;
strlist.Add('Some text');
strlist.Objects[strlist.Count - 1] := Pointer(Form1.handle);
form1.Caption := form1.Caption + ' ' + inttostr(THandle(strlist.Objects[strlist.Count - 1]));
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
strlist.Free;
end;
Вроде бы работает, спасибо!