![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как ускорить скорость выполнения циклов? [D7, WinXP]
Soi_ © (2007-06-04 12:18:00)Всем привет!
Подскажите пожалуйста, проблема такая, делаю программу для сопоставления содержимого 2-х компонентов memo. Все работает нормально, но ужасно медленно (и это при 1000 строк, а мне нужно будет примерно 10000 строк). Я подозреваю что это из-за циклов, подскажите как можно ускорить этот процесс?
procedure TForm1.Button4Click(Sender: TObject);
var nn,mm,k,k1:integer;
begin
progressbar1.max:=1000;
for nn:=0 to 1000 do begin
for mm:=0 to 1000 do begin
k:=memo1.Lines.IndexOf(memo1.Lines[nn]);
k1:=memo2.Lines.IndexOf(memo2.Lines[mm]);
if memo1.Lines[nn]=memo2.Lines[mm] then memo2.Lines.Move(k1,k);
progressbar1.Position:=nn;
end;
end;
beep;
MessageDlg('Сравнение файлов окончено!!!', mtInformation,[mbOk], 0);
end;
Сергей М. (2007-06-05 11:30:00) [1]
> Soi_ © (05.06.07 06:00) [12]
var
i, k: Integer;
s: String;
s1, s2, //исходные списки
s3, s4: TStringList; //результирующие списки
..
s2.Sorted := True; //предвар.сортировка обязательна для ускорения поиска в списке !
i := 0;
while i < s1.Count do begin
s := s1[i];
k := s2.IndexOf(s);
if k >= 0 then begin
s1.Delete(i);
s2.Delete(k);
s3.Add(s);
s4.Add(s);
end else
Inc(i);
end;
for i:= 0 to s1.Count - 1 do
s3.Add(s1[i]);
for i:= 0 to s2.Count - 1 do
s4.Add(s2[i]);
ЮЮ (2007-06-05 09:28:00) [2]Действительно идет речь об упорядочении memo2.lines по подобию memo1.lines (как по ссылке в [6])?
Есди да, то у тебя хреново реализованы рекомендации оотуда. Тут, имхо не нужен цикл в цикле, одного прохождения по memo2.lines, а memo1.lines.IndexOf - это и так цикл с целбю поиска
Soi_ (2007-06-05 06:00:00) [3]Переделал все с StringList, нифига быстро не пашет, запустил два файла на сравнение по 3500 строк, так судя по скорости progressbar все это закончится часов через 5
вот переделанный код с использованием StringList:
procedure TForm1.Button6Click(Sender: TObject);
var
s1,s2: TStringList;
var nn1,mm1,k1,k11:integer;
begin
s1:=TStringList.Create;
s1.AddStrings(form1.memo1.lines);
s2:=TStringList.Create;
s2.AddStrings(form1.memo2.lines);
//progressbar1.max:=rows;
for nn1:=0 to rows-1 do begin
k1:=s1.IndexOf(s1[nn1]);
for mm1:=0 to rows1-1 do begin
k11:=s2.IndexOf(s2[mm1]);
if s1[nn1]=s2[mm1] then s2.Move(k11,k1);
//progressbar1.Position:=nn1;
end;
end;
form1.memo2.Clear;
form1.memo2.Lines.AddStrings(s2);
beep;
MessageDlg('Синхронизация заверщена!!!', mtwarning,[mbOk], 0);
end;
X9 (2007-06-04 18:04:00) [4]> [10] Zagaevskiy © (04.06.07 18:00)
> Если хочешь сделать быстро, выводи % в лейбел
При таком подходе "быстро" не получится, опять же, присутствует переисовка.
Просто не нужно выполнять вывод состояния при каждой итерации. 10 раз в секунду будет предостаточно.
Zagaevskiy (2007-06-04 18:00:00) [5]progressbar1.Position:=...
нафига? выкинуть!
и вообще в любой проге, где информация о происходящем в принципе не так важна , а выводся в пару-тройку progressbar-ов и ещё лейбелы... не пойму, зачем это
Если хочешь сделать быстро, выводи % в лейбел
Stanislav (2007-06-04 13:39:00) [6]А это k:=memo1.Lines.IndexOf(memo1.Lines[nn]);
надо вообще перед 2-м циклом писать.
И еще
Loginov Dmitry © (04.06.07 12:26) [1] +
Anatoly Podgoretsky © (04.06.07 12:54) [8]
и будет быстро
Anatoly Podgoretsky (2007-06-04 12:54:00) [7]> clickmaker (04.06.2007 12:29:03) [3]
Вообще то это даже сортировка
homm (2007-06-04 12:52:00) [8]> progressbar1.Position:=nn;
Вот это убери из тела циклов, авось поможет.
Сергей М. (2007-06-04 12:43:00) [9]Подозреваю, что ноги у вопроса растут отсюда:
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1180593796&n=18
ЮЮ (2007-06-04 12:39:00) [10]k:=memo1.Lines.IndexOf(memo1.Lines[nn]); - вынести во внешний цикл
Все работает нормально. А что он делает? Что значит "сопоставление".
Почему а на таких данных он ничего не соаоставляет?
Memo1 Memo2
2 2
2 3
3 1
1 1
1 1
1 2
Теперь ещё и "стнхронизация" всплыла :) Всё равно не синхронизируется. А должен?
Soi_ (2007-06-04 12:32:00) [11]Ну да, согласен, правильнее это назвать синхронизацией.
clickmaker (2007-06-04 12:29:00) [12]
> MessageDlg('Сравнение файлов окончено!!!', mtInformation,[mbOk],
> 0);
это разве сравнение, а не синхронизация?
Desdechado (2007-06-04 12:28:00) [13]Не совсем понял, что надо, но зачем вложенные циклы?
Loginov Dmitry (2007-06-04 12:26:00) [14]Используй TStringList вместо Мемо. Будет на порядки быстрее.