Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.014 c
11-1162641928
KBAHT
2006-11-04 15:05
2007.06.24
KOL+KOLXPMan &amp; RichEdit


1-1177395892
Flagman
2007-04-24 10:24
2007.06.24
Анализ объемного html-файла


15-1180041541
snowkam2
2007-05-25 01:19
2007.06.24
угол падения равен углу отражения


2-1180626487
FIL-23
2007-05-31 19:48
2007.06.24
округление


1-1177404709
Zirf
2007-04-24 12:51
2007.06.24
TChart - снятие данных