Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Скорость работы программы во время выполнения цикла [D6, WinXP]


Страницы:   1 2 3

ТехникПТО ©   (2005-03-03 19:40:00) 

У меян в программе выполняеться большой цикл... и во время его выполнения.. программа "подвисает"... можно ли этого избежать??? чтобы не происходило подвисание программы...


GuAV   (2005-03-04 00:24:00) [21]

ТехникПТО ©   (03.03.05 20:09) [10]
  if (Pos(aText, Doc.All.Item(i).InnerText)<>0)
   and (length(Doc.All.Item(i).InnerText)=length(aText)) then


э.. это что ?

(Pos(aText, Doc.All.Item(i).InnerText)<>0) текст aText содержится в InnerText'е элемента.

(length(Doc.All.Item(i).InnerText)=length(aText)) длины текста aText InnerText'а элемента совпадают.

Если оба условия выполняются, то эти строки равны.

Т.е. может просто CompareStr (или другую ф-цию сравнения) ?


Eraser   (2005-03-03 23:54:00) [22]

ТехникПТО ©

Как уже говорили- алогоритм не очень...
Попробуй применить многопоточность...


Anatoly Podgoretsky   (2005-03-03 23:31:00) [23]

Для исключения защищенный блок не требуется.


Anatoly Podgoretsky   (2005-03-03 23:30:00) [24]

Второй вариант ьолее правильный, Интел и не только он требует от разработчиков компиляторов и программистов именно это - соответствие законам математики, деление на ноль не ошибка, а бесконечность, при А не равном нулю.

Result := бесконечность; // или скажем значение по договоренности, но лучше исключение, там будет однозначность.


GuAV   (2005-03-03 23:14:00) [25]

Anatoly Podgoretsky ©   (03.03.05 22:02) [32]
Kolan ©   (03.03.05 21:46) [27]


IMHO правильно так:

Result := A/B;

В случае ошибки пользователь увидит сообщение об ошибке.

или так:

SetExceptionMask([exInvalidOp, exDenormalized, exZeroDivide, exOverflow, exUnderflow, exPrecision]);
Result := A/B;

Если B = 0 исключения не будет, результат будет бесконечность (или NAN если A тоже 0).


DiamondShark   (2005-03-03 22:06:00) [26]


> except'ом я просто не даю появится окну ошибки и прервать
> вычисления.

А понту от твоих непрерванных вычислений на некорректных данных?


Anatoly Podgoretsky   (2005-03-03 22:02:00) [27]

jack128 ©   (03.03.05 21:58) [30]
Kolan ©   (03.03.05 21:46) [27]

Как справедливо замтил Джек, неопределенный результат, такого даже врагу не пожелаешь.
А правильно так:

try
Result := A/B;
except
Result := бесконечность; // или скажем значение по договоренности, но лучше исключение, там будет однозначность.
end;

Мне это подходит. Если B=0 то пользователь ничего не узнает об этом. Что тут неправильно?
Хуже он получить черт знает что.


Kolan   (2005-03-03 22:01:00) [28]

Ну
Result := 0;
try
Result := A/B;
except
end;
так правильно?
Try
except'ом я просто не даю появится окну ошибки и прервать вычисления.


jack128   (2005-03-03 21:58:00) [29]

Kolan ©   (03.03.05 21:46) [27]
Что тут неправильно?

то, что результат функции в случае если B = 0 неопределен.


ТехникПТО   (2005-03-03 21:53:00) [30]


> А вообще-то, алкогоритм просто ужасный...

знаю... :( не умею я писать рационально.. меня все учителя и преподы гоняют за это :)


DiamondShark   (2005-03-03 21:48:00) [31]


> а как нибудь можно УСКОРИТЬ выполнение цикла?

Можно.
Во-первых, вынести из цикла инвариант.

for i := 0 to Doc.All.Length - 1 do
 begin
   Application.ProcessMessages;
   if (Pos(aText, Doc.All.Item(i).InnerText)<>0) and
      (length(Doc.All.Item(i).InnerText)=length(aText)) then
     begin
       If Form8.checkBox1.Checked=true then Doc.All.Item(i).Style.BackGroundColor:=Form8.Edit1.Text;
       If Form8.checkBox6.Checked=true then Doc.All.Item(i).Style.Color:=Form8.Edit2.Text;
       exit;
    end;
 end;

Здесь Doc.All-- явный инвариант. Кроме того, это обращение очень "тяжёлое".
Так будет  уже лучше:

var
 elts: Variant;
...
elts := Doc.All;
for i := 0 to Doc.All.Length - 1 do
 begin
   Application.ProcessMessages;
   if (Pos(aText, elts.Item(i).InnerText)<>0) and
      (length(elts.Item(i).InnerText)=length(aText)) then
     begin
       If Form8.checkBox1.Checked=true then elts.Item(i).Style.BackGroundColor:=Form8.Edit1.Text;
       If Form8.checkBox6.Checked=true then elts.Item(i).Style.Color:=Form8.Edit2.Text;
       exit;
    end;
 end;

Во-вторых, кэшировать "тяжёлые" вычисления в цикле.
elts.Item(i) вычисляется много раз внутри цикла. Но это методобъекта. И вызывается он с использованием позднего связывания, а это тяжёлая операция.
Несколько раз вызывается и свойство style. Тоже затраты на вызов с поздним связыванием.
Ну и наконец условие
(Pos(aText, elt.InnerText)<>0) and (length(elt.InnerText)=length(aText))
логически эквивалентно просто
aText = elt.innerText
(+ X=true эквмвалентно просто X)
Так будет лучше:

var
 elts: Variant;
 elt: Variant;
 style: Variant;
...
elts := Doc.All;
for i := 0 to Doc.All.Length - 1 do
 begin
   Application.ProcessMessages;
   elt := elts.Item(i);
   if aText = elt.InnerText then
     begin
       If Form8.checkBox1.Checked then elt.Style.BackGroundColor:=Form8.Edit1.Text;
       If Form8.checkBox6.Checked then elt.Style.Color:=Form8.Edit2.Text;
       exit;
    end;
 end;


Ещё более радикальное ускорение даст отказ от использования позднего связывания и использовать интерфейсы.


> а что с except end; делать??

Как ни странно, не допускать возникновения исключений.
Они ведь отчего появляются? От того, что в Doc.all попадают все тэги, у некоторых из которых нету тех свойств, к которым идёт обращение (например, innerText, или style). Так ведь?
Это и к скорости, кстати, имеет отношение. Может быть, что проверка элемента, или уточнение условия отбора (скажем, использовать не all, а all.tags(...)) окажется менее затратным, чем возбуждение и удавление исключения.

ЗЫ
А вообще-то, алкогоритм просто ужасный...


Kolan   (2005-03-03 21:46:00) [32]

Здравствуйте,
 Мне тоже интересно, как правильно делать. Я тоже так бывает делаю. Напр
try
 Result := A/B;
except
end;
Мне это подходит. Если B=0 то пользователь ничего не узнает об этом. Что тут неправильно?


ТехникПТО   (2005-03-03 21:13:00) [33]


> Если не умеешь пользоваться анкета, то хотя бы научись пользоваться
> поисковыми системы и Google и Yandex меня знают.

уже нашел :) может подскажете чем try except end заменить?


Anatoly Podgoretsky   (2005-03-03 21:12:00) [34]

Если не умеешь пользоваться анкета, то хотя бы научись пользоваться поисковыми системы и Google и Yandex меня знают.


ТехникПТО   (2005-03-03 20:54:00) [35]


> 3. Мой сайт, проект DDP, если силы хватит скачать эту уйму
> книг.

ето где??


Anatoly Podgoretsky   (2005-03-03 20:52:00) [36]

Подсказываю несколько источников знаний, по степени важности
1. Встроеная справка
2. Исходники Дельфи
3. Мой сайт, проект DDP, если силы хватит скачать эту уйму книг.
4. FAQ, базы знаний, советы
5. Чужие сайты


ТехникПТО   (2005-03-03 20:50:00) [37]

а что мне с try except end делать?? после ошибки у меня аогоритм дальше не идет :(


ТехникПТО   (2005-03-03 20:48:00) [38]


> Тогда вам наверно надо принять программиста.
>
> Или серьезно заняться самообучение по хорошим книгам, решать
> в них примеры.

программист у нас есть:) тока он по 1С.. точнее ОНА :)ъ
а на литературу денег не дают :( вот и лазю по форумам


Anatoly Podgoretsky   (2005-03-03 20:44:00) [39]

Тогда вам наверно надо принять программиста.

Или серьезно заняться самообучение по хорошим книгам, решать в них примеры.


ТехникПТО   (2005-03-03 20:42:00) [40]


> Убрать как врага народа или возбуждать там специфическое
> исключение.
> Немного офтопика, меня терзает любопытство. Что такое ПТУ
> я знаю, а что такое ПТО?

Производственно технический отдел :)


> специфическое исключение.

ето еще что за зверь??
P.S. я самоучка :) так что прошу не судить строго :)


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо