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

Вниз

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

 
NeyroSpace ©   (2004-12-14 09:50) [0]

Сабж


 
ssk ©   (2004-12-14 09:57) [1]

INI


 
Digitman ©   (2004-12-14 10:06) [2]


> Как оптимальнее


"оптимальность" - понятие растяжимое.


 
NeyroSpace ©   (2004-12-14 10:13) [3]

На первое место уменьшение кода, чтобы не было ошибок. Нужно хранить Handle - строка[20].


 
Digitman ©   (2004-12-14 10:18) [4]


> уменьшение кода, чтобы не было ошибок


размер кода никак не связан с количеством каких-бы то ни было ошибок.


> Нужно хранить Handle - строка[20]


например, TStringList вполне подойдет для этой цели


 
Leonid Troyanovsky ©   (2004-12-14 10:19) [5]


> NeyroSpace ©   (14.12.04 10:13) [3]
> На первое место уменьшение кода, чтобы не было ошибок. Нужно
> хранить Handle - строка[20].


TStringList with THandle(Objects[i]).

--
Regards, LVT.


 
NeyroSpace ©   (2004-12-14 10:55) [6]

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;

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


 
Leonid Troyanovsky ©   (2004-12-14 11:05) [7]


> 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


 
Семен Сорокин ©   (2004-12-14 11:06) [8]


> strlist.Add("Some text");
> strlist.Objects[strlist.Count - 1] := Pointer(Form1.handle);

можно сразу
strlist.AddObject("Some text", TObject(Form1.handle));


 
NeyroSpace ©   (2004-12-14 11:23) [9]

>Leonid Troyanovsky ©   (14.12.04 11:05) [7]
На самом деле там будут хендлы файлов.


 
DiamondShark ©   (2004-12-14 12:25) [10]


> Нужно хранить Handle - строка[20].


type
 TData = record
   H: THandle;
   S: string[20];
 end;
 TDataList = array of TData;


стринглисты какие-то откуда-то взялись... бр-р...


 
Суслик ©   (2004-12-14 18:12) [11]


> [10] DiamondShark ©   (14.12.04 12:25)

а если таких записей будет много - тысяч 100000.
Добавление в дин массив по 1 элементу через setlength плохо скажется на производительности. Можно имитировать подход tlist с capacity и count, но это же надо делать...

Мой диагноз: для совета нужно знать сколько предполагается записей.


 
DiamondShark ©   (2004-12-14 18:34) [12]


> Добавление в дин массив по 1 элементу через setlength плохо
> скажется на производительности

Точно. А использование стринглист скажется хорошо.


> Мой диагноз: для совета нужно знать сколько предполагается
> записей.

Товарищ сказал, что собирается хранить хэндлы файлов.
Если задача предусматривает хранение сотни-другой хэндлов файлов, то, в принципе, и использование стринглиста для из хранения уже не выглядит слишком экстравагантно.
;)


 
Суслик ©   (2004-12-14 18:42) [13]


> Точно. А использование стринглист скажется хорошо.

Иронизируешь?
Ти реализацию stringlist смотрел? Например, на предмет подхода к использованию ReallocMem?

Можешь провети опыт: сравни добавление 10000 элементов по одному элементу в dyn array и в stringlist.


 
Anatoly Podgoretsky ©   (2004-12-14 19:05) [14]

При одинаковых алгоритмах, впереди будет ДМ


 
Суслик ©   (2004-12-14 19:16) [15]


> При одинаковых алгоритмах, впереди будет ДМ

а ты проверь.

{$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;


 
Суслик ©   (2004-12-14 19:22) [16]

Далее все растет по геометрической прогессии.
Судя по моим знаниям манагера памяти дельфи постоянно увеличивающиеся области памяти зачастую приводят к копированию данных. Поэтому получается n^2 операций.
StringLIst же - выделяет большими кусками. И потом помнит сам, сколько из них использует.


 
DiamondShark ©   (2004-12-14 19:40) [17]

Да, для 10000 по одному мы не будем использовать динмассив.
Убедил.


 
Суслик ©   (2004-12-14 19:49) [18]

А быстрее всего - реалиовать подход c capacity и count для dynarray. По времени добавляться будет одинаково. А вот доступ к элементам быстрее, т.к. не требуется вызов методов - доступ осущетствлятеся непосредственно к ячейкам памяти. См. cpu.


 
Anatoly Podgoretsky ©   (2004-12-14 19:50) [19]

Сказали же при одинаковых, а лучше наиболее оптимальным алгоритмом.
Теперь вот смени свой алгоритм так и снова измерь.

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-15 10:31) [20]


>  [19] Anatoly Podgoretsky ©   (14.12.04 19:50)

ну ладно, ладно :)) Так будет быстрее всего. Не спорил.

Напомню, что обсуждал я с Акуличевым, что добавлять по одному элементу в ДМ накладно, а в SL - нет.


 
Семен Сорокин ©   (2004-12-15 10:40) [21]

разогреем :))
а если вдруг понадобится :)) - отсортировать данные (а массиве, в листе), найти (в массиве, в листе), удалить из середины или начала (в массиве, листе)

ЗЫ. оговорюсь, в сабже сказано именно хранить, а не работать, поэтому можно считать провокацией.

ЗЫЫ. я тоже терпеть не могу динамические массивы :)


 
Суслик ©   (2004-12-15 10:46) [22]


>  [21] Семен Сорокин ©   (15.12.04 10:40)


> ЗЫ. оговорюсь, в сабже сказано именно хранить, а не работать,
> поэтому можно считать провокацией.

Согласен. Но форум на то и форум, что бы попутно узнать что-то новое.


> ЗЫЫ. я тоже терпеть не могу динамические массивы :)

Имхо зря. Для некоторых задач они очень удобны. Для хранения больших объемов данных, для которых предполагается активная обработка, они плохо подходят. А для хранения небольших списков неизвестной заранее длины очень даже.


 
Семен Сорокин ©   (2004-12-15 11:04) [23]


> Суслик ©   (15.12.04 10:46) [22]
> > ЗЫЫ. я тоже терпеть не могу динамические массивы :)
>
> Имхо зря. Для некоторых задач они очень удобны. Для хранения
> больших объемов данных, для которых предполагается активная
> обработка, они плохо подходят. А для хранения небольших
> списков неизвестной заранее длины очень даже.

Да понимаю что удобнее и быстрее, но всё равно через TList делаю -  привычка :(


 
Anatoly Podgoretsky ©   (2004-12-15 11:59) [24]

Семен Сорокин ©   (15.12.04 10:40) [21]
А провокация не получится, список реализован через динамический массив, является оберткой вокруг него!
Так что можешь использовать теже алгоритмы.


 
Anatoly Podgoretsky ©   (2004-12-15 12:04) [25]

Да и что бы не было попытки другой провокации, под списком имеется в виду именно TStringList, а не классический одно или двухсвязный списки.
И теперь если вертуься к вопросу, то он стоит так "Как оптимальнее всего хранить список из пар число - строка", то тут другой вопрос, что значит оптимальнее, какой именно критерий, если скорость перебора/доступа или размер в памяти то массив статический или динамический, если удобство манипулирования элементами, то TStringList, а если что то вообще другое, то это большой вопрос для телепатов.



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

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

Наверх




Память: 0.53 MB
Время: 0.047 c
4-1100073222
Lika
2004-11-10 10:53
2004.12.26
Com-порт


1-1102677491
PalPalych
2004-12-10 14:18
2004.12.26
Регистрация пакетов "BPL".


10-1074607237
morfey-night
2004-01-20 17:00
2004.12.26
динамическое создание TDataModule


3-1101878985
Sergo
2004-12-01 08:29
2004.12.26
InterBase


1-1102888330
Bobby Digital
2004-12-13 00:52
2004.12.26
Цвет