![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Производительность (оптимизация) функции [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]Прошу простить за путаницу в терминах, конечно речь идет о процедурах. :-)