Як прискорити швидкість виконання циклів

Всім привіт! Підкажіть будь ласка, проблема така, роблю програму для зіставлення вмісту 2-х компонентів memo. Все працює нормально, але дуже повільно (і це при 1000 рядків, а мені потрібно буде приблизно 10000 рядків). Я підозрюю, що це через цикли, підкажіть як можна прискорити цей процес?

procedure TForm1.Button4Click(Sender: TObject); var nn,mm,k,k1:integer; begin progressbar1.max:=1000; для mm:=0 до 1000 до початку 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;

Використовуйте TStringList замість Мемо. Буде на порядок швидше.

Не зовсім зрозумів, що треба, але навіщо вкладені цикли?

> MessageDlg("Порівняння файлів закінчено. ", mtInformation,[mbOk], > 0);це хіба порівняння, а не синхронізація?

Так, згоден, правильніше це назвати синхронізацією.

k:=memo1.Lines.IndexOf(memo1.Lines[nn]); - винести у зовнішній цикл

Все працює нормально. А що він робить? Що означає "порівняння". Чому а на таких даних він нічого не співаставляє? Memo1 Memo2 2 2 2 3 3 1 1 1 1 1 1 2

Тепер ще й "хронізація" спливла :) Все одно не синхронізується. А винен?

Підозрюю, що ноги у питання ростуть звідси:

> progressbar1.Position:=nn;Ось це прибери з тіла циклів, може допоможе.

Взагалі це навіть сортування

progressbar1.Position:=. нафіга? викинути! і взагалі в будь-якій прозі, де інформація про те, що відбувається в принципі не так важлива, а виводиться впару-трійку progressbar-ов і ще лейбели. не зрозумію, навіщо це Якщо хочеш зробити швидко, виводь % в лейбел

Просто не потрібно виконувати виведення стану при кожній ітерації. 10 разів на секунду буде достатньо.

Переробив все з 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 ; для nn1:=0 до рядків-1 до початку k1:=s1. =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;

Справді йдеться про впорядкування memo2.lines на кшталт memo1.lines (як за посиланням в [6])? Якщо ж, то в тебе хроново реалізовані рекомендації звідти. Тут, імхо не потрібен цикл у циклі, одного проходження по memo2.lines, а memo1.lines.IndexOf - це і так цикл з цілбю пошуку

var i, k: Integer; s: String; s1, s2, // вихідні списки s3, s4: TStringList; //результуючі списки .. s2.Sorted := True; //попереднє.сортування обов'язкове для прискорення пошуку в списку! i: = 0; while i = 0 then begin s1.Delete(i); s2.Delete(k); s3.Add(s); s4.Add(s); end else Inc(i); end; для i:= 0 до s1.Count - 1 do s3.Add(s1[i]); для i:= 0 до s2.Count - 1 do s4.Add(s2[i]);