Форум: "Основная";
Текущий архив: 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.037 c