Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как оптимальнее всего хранить список из пар число - строка?


Страницы:   1 2

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;

Вроде бы работает, спасибо!


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо