Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
3-10541
Zorik
2003-08-15 15:29
2003.09.04
опять транзакции


6-10861
cvv
2003-06-30 15:41
2003.09.04
почему не передаются файлы?


1-10711
x_michael
2003-08-20 13:41
2003.09.04
Объединение ячеек в StringGrid (DrawGrid)


14-10954
Kost
2003-08-15 22:03
2003.09.04
Графика


14-10928
peps
2003-08-17 04:38
2003.09.04
компонент