Главная страница
    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.48 MB
Время: 0.036 c
2-1180815045
sentinel112
2007-06-03 00:10
2007.06.24
Delphi+Mathcad


15-1179990326
Pazitron_Brain
2007-05-24 11:05
2007.06.24
Ценителям советской аудиотехники


15-1180147092
Begining
2007-05-26 06:38
2007.06.24
Есть ли разница передавать указатель или var-параметр?


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


2-1180721680
Ш-К
2007-06-01 22:14
2007.06.24
Сохранить массив в стринг





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский