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

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

Советы по оптимизации - 1 [D7, WinXP]


Страницы:   1 2

иосиф ©   (2006-01-11 07:30:00) 

Прочитал статью "Написание оптимального кода Delphi" она меня несколько смутила, да и мастера о ней отзываются не особо. Может быть действительно мастера поделятся своим опытом, дадут советы в плане оптимизации критичных по времени участков кода.

Вот к примеру стоит задача в один из методов (который буквально "постоянно" вызывается) приходит ряд параметров связанных с фильтрацией, последний же параметр передается по ссылку, чтобы подтвердить или опровергнуть фильтрацию. Как лучше организовывать подобную фильтрацию изнутри:


procedure TfrmMain.TestFilter(
 const Params: TSomeParams; var Filtered: Boolean);
begin
{ отлов объектов одного типа }
if Params.OType=otType1 then
begin
 if GetInfoObj<>-1 then
 begin
  if SomeData>=OtherData then Filtered:=False else Filtered:=True;
 end;
end;
{ отлов границ районов }
if Params.OType=otType2 then
begin
 if GetInfoObj<>2 then
 begin
  if SomeData>=OtherData then Filtered:=False else Filtered:=True;
 end;
end;
end;


Код приведен в общем виде. Интересно что лучше здесь применять - набор if инструкций, сделать все большим case, каким образом лучше организовывать последовательность if'ов и т.д.

з.ы. Хотелось бы все-таки что-то типа статьи, но оформленной в виде форуме нашими же мастерами. Среди них ведь есть люди, опыт которых не вызывает сомнений, а у многих есть желание подучиться ) может стоило и в потрепаться запостить...


MBo   (2006-01-11 08:25:00) [21]

С точки зрения расширения и поддержания кода лучше, наверно, использовать принципы ООП - SomeParams превратить в объект с виртуальным методом фильтрации.

Если же оставить тип-запись, то многое зависит от количества вариантов параметров, по которым делается выбор. Если немного - case вполне достойно себя ведет.
В этой статье другой способ применен - большой case приводил к замедлению, и использованы указатели на функции (можно сделать массив процедурных переменных, индексированный параметром выбора):
http://www.delphimaster.ru/articles/pixels/index.html


иосиф   (2006-01-11 08:20:00) [22]

если идти путем мастера MBo, то логично заменить:

 
 if SomeParams.ID=frmMain.CurrentID then
  Filtered:=frmMain.ShowObject2 // boolean
 else
  Filtered:=False;


на


 Filtered:=(SomeParams.ID=frmMain.CurrentID) AND frmMain.ShowObject2


но так падает читаемость кода, имхо. стоит ли оно того?


иосиф   (2006-01-11 08:04:00) [23]

Владислав ©   (11.01.06 07:44) [1]
какой профайлер посоветуете под Delphi7? есть QATime, но он не бесплатен =( в основном натыкался на толковые memchecker'ы, но не на профайлеры (

MBo ©   (11.01.06 07:52) [2]
я понимаю приведенный код ужасен в плане описания ситуации. хотелось бы услышать общие напутствия ) что мол если таки то условия, то лучше бы сделать так, иначе вот так =)

данный обработчик может постепенно расти в объеме, добавляя новые условия фильтраций:


procedure TfrmMain.TestFilter(
 const SomeParams: TSomeParams; var Filtered: Boolean);
var
FParam: Integer;
begin
{ отлов объекта 1 }
if SomeParams.OType=otType1 then
begin
 FParam:=Integer(SomeParams.Detailed^);
 if FParam<>-1 then
  Filtered:=FParam<SomeObject.FParam;
end;
{ отлов объекта 2 }
if SomeParams.OType=otType2 then
begin
 if SomeParams.ID=frmMain.CurrentID then
  Filtered:=frmMain.ShowObject2 // boolean
 else
  Filtered:=False;
end;
end;


вот после преобразования так выглядит ) теоретически может быть расширен список фильтраций.


MBo   (2006-01-11 07:52:00) [24]

По приведенному фрагменту нельзя дать серьезных рекомендаций.
Неясно, много ли в реальном коде вариантов параметров, что делает GetInfoObj, каково будет значение Filtered при невыполнении условий if GetInfoObj и т.д.

P.S.
Эту строчку
>if SomeData>=OtherData then Filtered:=False else Filtered:=True;
лучше записать так:
Filtered := SomeData < OtherData;


Владислав   (2006-01-11 07:44:00) [25]

Так для этого профайлеры существуют.
Чего гадать, как лучше if'ы разместить, если проблема в другом месте может быть?


Страницы:   1 2

Наверх

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