![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Неодинаковое время выполнения. Почему? [D7, WinXP]
Magic_STI © (2005-01-18 21:25:00)В общем есть два кода, первый
var
f:tmeminifile;
i:integer;
sl:tstringlist;
...
begin
f:=tmeminifile.create(filename);
sl:=tstringlist.create;
f.readsections(sl);
for i:=0 to sl.count-1 do
sl[i]:=sl[i]+'='+f.readstring(sl[i],'Title','');
...
Второй код:
var
p:integer;
f:tmeminifile;
sl:tstringlist;
...
begin
f:=tmeminifile.create(filename);
sl:=tstringlist.create;
p:=pos('_',str);
while p<>0 do begin
sl.add(f.readstring(copy(str,1,p-1),'Title','');
delete(str,1,p);
p:=pos('_',str);
end;
...
Так вот первый код на файле размером 200 с копейками секций выполняется за 1с. А второй работает стока, что я потянуться к кресле успеваю и попрыгать на одной ножке... Почему так? Из-за чего это в принципе может быть?
Magic_STI (2005-01-19 21:27:00) [1]Хреново. Ладно, тогда придется пользоваться первым алгоритмом... Всем спасибо...
begin...end (2005-01-19 21:24:00) [2]> [10] Magic_STI (19.01.05 20:59)
Ну если parentstr+copy(str,1,p-1)действительно даёт корректное имя секции, то тогда не знаю... Сдаюсь. :-)
Magic_STI (2005-01-19 20:59:00) [3]ОЙ, блин, я этот код просто без Делфей писал, на память. Там еще переменная parentstr, в которую пишется то, что потом удаляется...
var
p:integer;
f:tmeminifile;
sl:tstringlist;
parentstr:string;
...
begin
f:=tmeminifile.create(filename);
sl:=tstringlist.create;
p:=pos('_',str);
while p<>0 do begin
sl.add(f.readstring(parentstr+copy(str,1,p-1),'Title','');
parentstr:=parentstr+copy(str,1,p);
delete(str,1,p);
p:=pos('_',str);
end;
begin...end (2005-01-19 20:42:00) [4]> [8] Magic_STI (19.01.05 20:10)
> [BZONE]
> [Bzone_bzo1]
> [Bzone_bzo1_ag2]
>
> А строка выглядит
> Bzone_bzo1_ag2
Ну тогда названия секций, которые нужно получить из этой строки, будут: 'Bzone', 'Bzone_bzo1', 'Bzone_bzo1_ag2', так? А в Вашем коде (в варианте, про который Вы говорите, что он долго выполняется) из этой строки получаются такие названия: 'Bzone', 'bzo1' и т.д. Нестыковочка какая-то... :-)
Magic_STI (2005-01-19 20:10:00) [5]Ага, именно, тока имена секций в виде дерева. Т.Е.
[BZONE]
[Bzone_bzo1]
[Bzone_bzo1_ag2]
А строка выглядит
Bzone_bzo1_ag2
begin...end (2005-01-18 22:26:00) [6]> [6] Magic_STI (18.01.05 22:16)
И что в ней находится? Имена секций, разделённые символом '_' ?
Magic_STI (2005-01-18 22:16:00) [7]Символов 30 максимум
begin...end (2005-01-18 22:12:00) [8]> [4] Magic_STI (18.01.05 22:05)
Строка str большая?
Magic_STI (2005-01-18 22:05:00) [9]Хм, понимаешь, дело не в этом. Если убрать из второго кода вызов чтения из файла,и заменить его фиксированным значением, то он выполняется очень быстро...
begin...end (2005-01-18 22:02:00) [10]> Magic_STI (18.01.05 21:25)
> p:=pos('_',str);
> while p<>0 do begin
> sl.add(f.readstring(copy(str,1,p-1),'Title','');
> delete(str,1,p);
> p:=pos('_',str);
> end;
А если так:
var
I, P: Integer;
begin
P := 1;
for I := 2 to Length(str) do
if str[I] = '_' then
begin
sl.Add(f.ReadString(Copy(str, P, I - P), 'Title', '');
P := I + 1
end
end
или даже так:
var
I: Integer;
begin
with TStringList.Create do
try
Delimiter := '_';
DelimitedText := str;
for I := 0 to Count - 2 do
sl.Add(f.ReadString(Strings[I], 'Title', '')
finally
Free
end
end
?
Magic_STI (2005-01-18 21:38:00) [11]Строчка...
raidan (2005-01-18 21:34:00) [12]Что такое str?