Текущий архив: 2003.09.04;
Скачать: CL | DM;
Вниз
Тормоза в программе !! Найти похожие ветки
← →
Delpher_Gray © (2003-08-20 19:20) [0]У меня в программе есть цикл, который должен продолжаться мину 30, а может даже больше. При запуске этого цикла, первые 10-15 секунд цикл работает очень быстро, а потом постепенно начинает тормизить... Подскажите почему, и как убрать такие тормоза ?
Заранее благодарен !
← →
Anatoly Podgoretsky © (2003-08-20 19:26) [1]Неправильный цикл, для лечения надо убрать тормоза.
← →
Delpher_Gray © (2003-08-20 19:27) [2]while go do
begin
for i := 0 to *** do begin
.............
end;
end;
← →
Юрий Федоров © (2003-08-20 19:41) [3]>>Delpher_Gray © (20.08.03 19:27) [2]
Если хочешь помощи, приведи весь относящийся к теме код.
Телепатия пока в качестве обязательного вопроса в экзаменационные билеты по программированию не входит :-)
← →
Skier © (2003-08-20 19:51) [4]Видимо течёт тормозная жидкость...
Срочно починить !
← →
Delpher_Gray © (2003-08-20 20:11) [5]procedure TForm1.StartClick(Sender: TObject);
var
i: integer;
MD5Digest: TMD5Digest;
ResMD5: string;
begin
Brute := true;
StatusBar.SimpleText := "Идёт перебор...";
// Записываем все знаки в массив
SetLength(T, 0);
if StartWord.Text <> "" then
begin
SetLength(T, Length(T) + 1);
T[High(T)] := StartWord.Text;
end else
begin
for Res := 1 to Length(Words.Text) do
begin
SetLength(T, Length(T) + 1);
T[High(T)] := Words.Text[Res];
end;
end;
// Перебираем...
Res := 0;
while Brute do
begin
for i := 1 to Length(Words.Text) do
begin
SetLength(T, Length(T) + 1); // Увеличиваем массив
T[High(T)] := T[Res] + Words.Text[i]; // Добавляем комбинацию
end;
Application.ProcessMessages;
// Выводим результат
MD5Digest := MD5String(T[Res]);
ResMD5 := MD5DigestToStr(MD5Digest);
if ResMD5 = Password.Text then
begin
Brute := false;
StatusBar.SimpleText := "Перебор окончен... Результат: "+T[Res];
Application.MessageBox(PChar("Перебор окончен !"+#10#13+"Пароль: "+T[Res]), "Перебор окончен", MB_ICONINFORMATION+MB_SYSTEMMODAL);
StartWord.Text := T[Res];
end;
if ShowResult.Checked then
begin
StartWord.Text := T[Res];
Comb.Caption := IntToStr(Res);
end;
Inc(Res);
end;
end;
← →
Юрий Федоров © (2003-08-20 20:17) [6]>>Delpher_Gray © (20.08.03 20:11) [5]
Сейчас нет времени разбираться, навскидку :
попробуй увеличивать размер массива не на каждом проходе цикла
SetLength(T, Length(T) + 1); // Увеличиваем массив
а один раз вначале, потому что это достаточно "тяжелая" операция
Если нужно, пройди сначала другой цикл(облегченный) для определения нужной длины массива
← →
Serginio1 (2003-08-20 20:42) [7]Посмотри реализацию Tlist,TMemoryStream с Capacity.
Если же размер более 6 мб, то посмотри
http://www.1c.hippo.ru/cgi-bin/predownl.cgi?id=2019
Там есть реализация MemoryStream для больших объемов и динамический массив реализованные ввиде связанных массивов определенной длины. У тебя проблема с распределением непрерывной памяти.
← →
app © (2003-08-20 20:53) [8]Delpher_Gray © (20.08.03 19:27) [2]
Этот цикл выполяется с постоянной скоротью, прямо пропорциональной количеству итераций.
Delpher_Gray © (20.08.03 20:11) [5]
А вот этот цикл нет, поскольку на каждой итерации происходит перераспределение памяти
Вывод: не делать это на каждой итерации, посмотри как например работает TList
← →
Delpher_Gray © (2003-08-20 21:55) [9]Всё я понял...........
Сделал на TStringList, и теперь у меня 14 - 20 тысяч комбинаций за 5 сек :)
Тока проблема есть...
Если массив становится очень большим, то комп виснет !!
Нужно его очистить значет:
while Brute do
begin
List.Add("...");
if List.Count > 1000000 then
begin
LastStr := List.Strings[List.Count -1];
List.Clear;
List.Add(LastStr);
end;
end;
Но так возникает ошибка: List index out of bounds !
В чём дело ??
← →
Anatoly Podgoretsky © (2003-08-20 22:29) [10]Где то есть ошибка
← →
Delpher_Gray © (2003-08-21 10:01) [11]Нашёл ошибку........
А этим алгоритмом очищасть массив невозможно !!
Нужно немного переделывать...
← →
Anatoly Podgoretsky © (2003-08-21 10:02) [12]Можно, просто у тебя ошибки.
Страницы: 1 вся ветка
Текущий архив: 2003.09.04;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.032 c