Текущий архив: 2007.06.24;
Скачать: CL | DM;
Вниз
Как ускорить скорость выполнения циклов? Найти похожие ветки
← →
Soi_ © (2007-06-04 12:18) [0]Всем привет!
Подскажите пожалуйста, проблема такая, делаю программу для сопоставления содержимого 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;
← →
Loginov Dmitry © (2007-06-04 12:26) [1]Используй TStringList вместо Мемо. Будет на порядки быстрее.
← →
Desdechado © (2007-06-04 12:28) [2]Не совсем понял, что надо, но зачем вложенные циклы?
← →
clickmaker © (2007-06-04 12:29) [3]
> MessageDlg("Сравнение файлов окончено!!!", mtInformation,[mbOk],
> 0);
это разве сравнение, а не синхронизация?
← →
Soi_ © (2007-06-04 12:32) [4]Ну да, согласен, правильнее это назвать синхронизацией.
← →
ЮЮ © (2007-06-04 12:39) [5]k:=memo1.Lines.IndexOf(memo1.Lines[nn]); - вынести во внешний цикл
Все работает нормально. А что он делает? Что значит "сопоставление".
Почему а на таких данных он ничего не соаоставляет?
Memo1 Memo2
2 2
2 3
3 1
1 1
1 1
1 2
Теперь ещё и "стнхронизация" всплыла :) Всё равно не синхронизируется. А должен?
← →
Сергей М. © (2007-06-04 12:43) [6]Подозреваю, что ноги у вопроса растут отсюда:
http://delphimaster.net/view/2-1180593796/
← →
homm © (2007-06-04 12:52) [7]> progressbar1.Position:=nn;
Вот это убери из тела циклов, авось поможет.
← →
Anatoly Podgoretsky © (2007-06-04 12:54) [8]> clickmaker (04.06.2007 12:29:03) [3]
Вообще то это даже сортировка
← →
Stanislav © (2007-06-04 13:39) [9]А это k:=memo1.Lines.IndexOf(memo1.Lines[nn]);
надо вообще перед 2-м циклом писать.
И еще
Loginov Dmitry © (04.06.07 12:26) [1] +
Anatoly Podgoretsky © (04.06.07 12:54) [8]
и будет быстро
← →
Zagaevskiy © (2007-06-04 18:00) [10]progressbar1.Position:=...
нафига? выкинуть!
и вообще в любой проге, где информация о происходящем в принципе не так важна , а выводся в пару-тройку progressbar-ов и ещё лейбелы... не пойму, зачем это
Если хочешь сделать быстро, выводи % в лейбел
← →
X9 © (2007-06-04 18:04) [11]> [10] Zagaevskiy © (04.06.07 18:00)
> Если хочешь сделать быстро, выводи % в лейбел
При таком подходе "быстро" не получится, опять же, присутствует переисовка.
Просто не нужно выполнять вывод состояния при каждой итерации. 10 раз в секунду будет предостаточно.
← →
Soi_ © (2007-06-05 06:00) [12]Переделал все с 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;
← →
ЮЮ © (2007-06-05 09:28) [13]Действительно идет речь об упорядочении memo2.lines по подобию memo1.lines (как по ссылке в [6])?
Есди да, то у тебя хреново реализованы рекомендации оотуда. Тут, имхо не нужен цикл в цикле, одного прохождения по memo2.lines, а memo1.lines.IndexOf - это и так цикл с целбю поиска
← →
Сергей М. © (2007-06-05 11:30) [14]
> 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]);
Страницы: 1 вся ветка
Текущий архив: 2007.06.24;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.036 c