Форум: "Основная";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
ВнизНеодинаковое время выполнения. Почему? Найти похожие ветки
← →
Magic_STI (2005-01-18 21:25) [0]В общем есть два кода, первый
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с. А второй работает стока, что я потянуться к кресле успеваю и попрыгать на одной ножке... Почему так? Из-за чего это в принципе может быть?
← →
raidan © (2005-01-18 21:34) [1]Что такое str?
← →
Magic_STI (2005-01-18 21:38) [2]Строчка...
← →
begin...end © (2005-01-18 22:02) [3]> 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 22:05) [4]Хм, понимаешь, дело не в этом. Если убрать из второго кода вызов чтения из файла,и заменить его фиксированным значением, то он выполняется очень быстро...
← →
begin...end © (2005-01-18 22:12) [5]> [4] Magic_STI (18.01.05 22:05)
Строка str большая?
← →
Magic_STI (2005-01-18 22:16) [6]Символов 30 максимум
← →
begin...end © (2005-01-18 22:26) [7]> [6] Magic_STI (18.01.05 22:16)
И что в ней находится? Имена секций, разделённые символом "_" ?
← →
Magic_STI (2005-01-19 20:10) [8]Ага, именно, тока имена секций в виде дерева. Т.Е.
[BZONE]
[Bzone_bzo1]
[Bzone_bzo1_ag2]
А строка выглядит
Bzone_bzo1_ag2
← →
begin...end © (2005-01-19 20:42) [9]> [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:59) [10]ОЙ, блин, я этот код просто без Делфей писал, на память. Там еще переменная 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 21:24) [11]> [10] Magic_STI (19.01.05 20:59)
Ну если parentstr+copy(str,1,p-1) действительно даёт корректное имя секции, то тогда не знаю... Сдаюсь. :-)
← →
Magic_STI (2005-01-19 21:27) [12]Хреново. Ладно, тогда придется пользоваться первым алгоритмом... Всем спасибо...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.043 c