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

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

Производительность (оптимизация) функции [D6, Win95/98]


pasha_golub ©   (2004-06-09 10:44:00) 

Имеем код:

type
 TForm1 = class(TForm)
    ...
 end;

MeasureFunc = procedure(ACanvas: TCanvas; ARect: TRect;
         FromColor, ToColor: TColor);
var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure VGradientFill(ACanvas: TCanvas; ARect: TRect;
         FromColor, ToColor: TColor);
var
 FC: array [0..3] of byte absolute FromColor;
 TC: array [0..3] of byte absolute ToColor;
 Steps, Y: integer;
 DR, DG, DB: integer;
begin
 Steps := ARect.Bottom - ARect.Top - 2;
 if Steps


Daniel_   (2004-06-09 14:37:00) [1]

> с помощью профайлера
> Профайлером скорее всего.

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


pasha_golub   (2004-06-09 13:36:00) [2]

MBo ©   (09.06.04 13:32) [10]
Нет, не удаляет. Res - это ж вар-параметр


pasha_golub   (2004-06-09 13:33:00) [3]

Опять я прогнал. Забыл убрать Canvas.MoveTo:

procedure VGradientFill(ACanvas: TCanvas; ARect: TRect;
         FromColor, ToColor: TColor; var Res:TColor);
var
 FC: array [0..3] of byte absolute FromColor;
 TC: array [0..3] of byte absolute ToColor;
 Steps, Y: integer;
 DR, DG, DB: integer;
begin
 Steps := ARect.Bottom - ARect.Top - 2;
 if Steps <= 0 then Exit;
 FromColor := ColorToRGB(FromColor);
 ToColor := ColorToRGB(ToColor);
 DR := TC[0] - FC[0];
 DG := TC[1] - FC[1];
 DB := TC[2] - FC[2];
 for Y := ARect.Top + 1  to ARect.Bottom - 1 do
   with ACanvas do
     begin
      //MoveTo(ARect.Left, Y);
      Res{Brush.Color} := RGB(TC[0] - MulDiv(DR,Y,Steps),
                       TC[1] - MulDiv(DG,Y,Steps),
                       TC[2] - MulDiv(DB,Y,Steps));
      //LineTo(ARect.Right,Y);
     end;
end;

В таком же духе и другие процедуры. Получил на 10000 итерациях:
1. 1854
2. 2001
3. 1846


MBo   (2004-06-09 13:32:00) [4]

>pasha_golub ©   (09.06.04 13:24) [6]
А оптимизатор не удаляет строку:
Res := RGB(TC[0] - MulDiv(DR,Y,Steps),
               TC[1] - MulDiv(DG,Y,Steps),
               TC[2] - MulDiv(DB,Y,Steps));
?
может, завести глобальную переменную dummy, делать, например, dummy:=Res xor dummy, в конце вывести ее значение...


pasha_golub   (2004-06-09 13:28:00) [5]

Daniel_   (09.06.04 13:22) [5]
Профайлером скорее всего.


pasha_golub   (2004-06-09 13:28:00) [6]

Удалено модератором
Примечание: Дубль


MBo   (2004-06-09 13:27:00) [7]

>Daniel_
с помощью профайлера


pasha_golub   (2004-06-09 13:24:00) [8]

Изменил код процедур:

procedure VGradientFill(ACanvas: TCanvas; ARect: TRect;
         FromColor, ToColor: TColor; var Res:TColor);
var
 FC: array [0..3] of byte absolute FromColor;
 TC: array [0..3] of byte absolute ToColor;
 Steps, Y: integer;
 DR, DG, DB: integer;
begin
 Steps := ARect.Bottom - ARect.Top - 2;
 if Steps <= 0 then Exit;
 FromColor := ColorToRGB(FromColor);
 ToColor := ColorToRGB(ToColor);
 DR := TC[0] - FC[0];
 DG := TC[1] - FC[1];
 DB := TC[2] - FC[2];
 for Y := ARect.Top + 1  to ARect.Bottom - 1 do
   with ACanvas do
     begin
      MoveTo(ARect.Left, Y);
      Res := RGB(TC[0] - MulDiv(DR,Y,Steps),
                TC[1] - MulDiv(DG,Y,Steps),
                TC[2] - MulDiv(DB,Y,Steps));
      //LineTo(ARect.Right,Y);
     end;
end;


В результате на 10000 итерациях:
1. 3810
2. 3959
3. 3815


Daniel_   (2004-06-09 13:22:00) [9]

MBo ©  
А можно глупый, наверное, вопрос?

Каким образом вы узнаете какую долю времени выполняется каждая операция?


MBo   (2004-06-09 12:44:00) [10]

>Что совсем одинаковое? :-)
Да, в пределах погрешности (полпроцента)

>96% процента времени занимает вывод графики ;)
В частности, изменение цвета пера (Pen.Color := ) - более половины времени работы программы.

>Кто ж спорит? :-)
Так сделай тест разумнее...


pasha_golub   (2004-06-09 12:38:00) [11]

1. у меня время одинаковое
Хм, вот те на. Что совсем одинаковое? :-)

2. 96% процента времени занимает вывод графики ;)
Кто ж спорит? :-)


MBo   (2004-06-09 12:34:00) [12]

1. у меня время одинаковое
2. 96% процента времени занимает вывод графики ;)


pasha_golub   (2004-06-09 10:45:00) [13]

Прошу простить за путаницу в терминах, конечно речь идет о процедурах. :-)


Наверх

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