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

Вниз

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

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

Наверх




Память: 0.51 MB
Время: 0.041 c
1-1102796522
Mega Mike
2004-12-11 23:22
2004.12.26
Рабоат функции или процедуры в фоновом режиме...


1-1102779499
dellax
2004-12-11 18:38
2004.12.26
Запуск почтового клиента с определённым адресом


1-1102577907
vvllaadd
2004-12-09 10:38
2004.12.26
Подскажите пожалуйста, каким образом настроить DBChart


3-1101107259
MakNik
2004-11-22 10:07
2004.12.26
dxDBGrid


1-1102439557
YUKLA
2004-12-07 20:12
2004.12.26
Range.Find.Execute - Слишком длинный строковый параметр





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