Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Неодинаковое время выполнения. Почему? [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?


Наверх

Титульная страница Поиск, карта сайта Написать письмо