Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизация кода, графика, Как оптимизировать код,работа с графико 
:(
    Опции темы
Zozik
Дата 10.8.2008, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 22.7.2008

Репутация: нет
Всего: нет



Помогите ускорить работу программы. Суть программы такова: Она рисует рисунок по пикселям. Каждому пикселю присваивается цвет в зависимости от значения числа. Чтобы вычислить значение числа нужно произвести в среднем 15-25 вычислений(может доходить и до 100). Пусть у нас рисунок 500 на 500 пикселей и того 500*500*20=5 000 000 вычислений. Мне любыми методами нужно ускорить работу программы. 

И еще, обьясните почему так. Например рисую рисунок 200 на 200 - это занимает 1406 ms времени. Запускаю программу без вывода графики - это занимает 330 ms(только исчисления). Запускаю программу без вычислений, только вывод рисунка(значения генерирую с помощью random) - это занимает 110 ms. 330+110 не равно 1406 

Код

procedure TForm1.Button1Click(Sender: TObject);
Label M,R;
Var  bb : TBitmap;
     Z,chast,dest,poh: TComplex;
     i,j,k,c,l,v,u,s,o,ii,jj,kk,cc:integer;
     a,b,t,d,w,h,p,pos_time:real;
     st,strr,strz:string;
     Wiz1:array [1..10] of integer;
     Wiz2:array [1..10] of real;
     Wiz3:array [1..10] of real;
     t1, t2 : cardinal;
begin
t1:=GetTickCount;
bb:= TBitmap.Create();
bb.Width := 800; bb.Height := 800;
k:=0;
c:=StrToInt(Edit6.text); {Разришение рисунка с на с пикселей}

...........................................{тут цыклов нет и времени много не занимает работа программы}


for i:=1 to c do   {Цыкл вычисления числа, каждому результату(точке) присваивается цвет.}
for j:=1 to c do   {Потом по результатам получаем рисунок }
begin
  dest:=StrToComplex('0+0i');
  poh:=StrToComplex('0+0i');

 if (i=round(c/2)+1) and (j=round(c/2)+1) then
  begin
   bb.Canvas.Pixels [i,j]:=clBlack;
   goto M
  end;

 a:=d+W-t*(j-1);
 b:=-d+H+t*(i-1);
 if b<0 then
 st:=FloatToStr(a)+FloatToStr(b)+'i'
 else
 st:=FloatToStr(a)+'+'+FloatToStr(b)+'i';
 z:=StrToComplex(st); {Точка - комплексное число}

 {Вычисление значения dest, jj - число не большое - в основном 2-3 }
 for cc:=1 to jj+1  do
dest:=cSum(cSum(dest,cMul(StrToComplex(FloatToStr(Wiz2[cc])),cPow(z,Wiz1[cc]))),StrToComplex(FloatToStr(Wiz3[cc])));


 for cc:=1 to jj  do
 if Wiz1[cc]=1 then
 poh:=cSum(poh,StrToComplex(FloatToStr(Wiz2[cc]))) else
 poh:=cSum(poh,cMul(cMul(StrToComplex(FloatToStr(Wiz2[cc])),StrToComplex(IntToStr(Wiz1[cc]))),cPow(z,Wiz1[cc]-1)));

 if (Re(poh)=0) and (Im(poh)=0) then
  begin
   bb.Canvas.Pixels [i,j]:=clBlack;
   goto M
  end;


 chast:=cSub(z,cDiv(dest,poh));
 While cAbs(cSub(z,chast))>StrToFloat('0,0000000001') do
  begin
   dest:=StrToComplex('0+0i');
   poh:=StrToComplex('0+0i');
   Z:=chast;


 for cc:=1 to jj+1  do
dest:=cSum(cSum(dest,cMul(StrToComplex(FloatToStr(Wiz2[cc])),cPow(z,Wiz1[cc]))),StrToComplex(FloatToStr(Wiz3[cc])));


 for cc:=1 to jj  do
 if Wiz1[cc]=1 then
 poh:=cSum(poh,StrToComplex(FloatToStr(Wiz2[cc]))) else
 poh:=cSum(poh,cMul(cMul(StrToComplex(FloatToStr(Wiz2[cc])),StrToComplex(IntToStr(Wiz1[cc]))),cPow(z,Wiz1[cc]-1)));
 
   if (Re(poh)=0) and (Im(poh)=0) then
    begin
     bb.Canvas.Pixels [i,j]:=clBlack;
     goto M
    end;

   chast:=cSub(z,cDiv(dest,poh));
   k:=k+1;
   if K>100 then goto R;
  end;

 R:
 P:=1275/StrToInt(Edit2.text);
 l:=round(k*p);

 If  (l>=0) and (l<=255) then
 bb.Canvas.Pixels[i,j]:=rgb(255,l,0);
 If  (l>255) and (l<=510) then
 bb.Canvas.Pixels[i,j]:=rgb(510-l,255,0);
 If  (l>510) and (l<=765) then
 bb.Canvas.Pixels[i,j]:=rgb(0,255,l-510);
 If  (l>765) and (l<=1020) then
 bb.Canvas.Pixels [i,j]:=rgb(0,1020-l,255);
 If  (l>1020) and (l<=1275) then
 bb.Canvas.Pixels[i,j]:=rgb(l-1020,0,255);
 If l>1275 then
 bb.Canvas.Pixels[i,j]:=rgb(0,0,0);
 k:=0;
 M:
end;

Image2.Picture.Bitmap := bb;
bb.SaveToFile('бяка.bmp');

t2:=GetTickCount;
pos_time:=(t2-t1);

Label1.Caption :=FloatToStr(pos_time);
end
Код


;

PM MAIL   Вверх
THandle
Дата 10.8.2008, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 50
Всего: 372



Первое что могу сказать по коду - это надо избавиться от строк и переводов(StrToХХХ). Довольно много времени будут брать, да еще и в цикле.

Второе: избавиться от goto, с его присутствием отпадает всякое желание читать код дальше. 
PM   Вверх
Zozik
Дата 10.8.2008, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 22.7.2008

Репутация: нет
Всего: нет



Думаю что от строк никак не избавлюсь, так как я считываю выражение(строку) с формы, а потому и проблематично без переводов (StrToХХХ). 

Goto использую для того чтобы исбечь деление на ноль(точка автоматически закрасывается в чорный цвет и кидает в конец цыкла)
PM MAIL   Вверх
THandle
Дата 10.8.2008, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 50
Всего: 372



Цитата(Zozik @  10.8.2008,  21:16 Найти цитируемый пост)
Думаю что от строк никак не избавлюсь, так как я считываю выражение(строку) с формы, а потому и проблематично без переводов (StrToХХХ). 


А зря. ИМХО, все эти переводы и занимают большую часть времени.

Цитата(Zozik @  10.8.2008,  21:16 Найти цитируемый пост)
Goto использую для того чтобы исбечь деление на ноль(точка автоматически закрасывается в чорный цвет и кидает в конец цыкла) 


А для Чего continue, break? Я за все время своей программерской деятельности ни разу не нашел места куда бы всунуть goto... А со всеми этими переходами становится довольно трудно поянть что к чему в коде. 

Да, кстати, скомпилировать все это дело у меня не получается из-за(прикреплено в файле).

Просьба выложить полный код и прислушаться таки к моим первым двум советам, после этого можно будет уже думать об оптимизации...




Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  1.txt 3,01 Kb
PM   Вверх
Zozik
Дата 10.8.2008, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 22.7.2008

Репутация: нет
Всего: нет



Код

unit Beta;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Compl, jpeg, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Image1: TImage;
    Edit6: TEdit;
    Label1: TLabel;
    Image2: TImage;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
Label M,R;
Var  bb : TBitmap;
     Z,chast,dest,poh: TComplex;
     i,j,k,c,l,v,u,s,o,ii,jj,kk,cc:integer;
     a,b,t,d,w,h,p,pos_time:real;
     st,strr,strz:string;
     Wiz1:array [1..10] of integer;
     Wiz2:array [1..10] of real;
     Wiz3:array [1..10] of real;
     t1, t2 : cardinal;
begin
t1:=GetTickCount;
bb:= TBitmap.Create();
c:=StrToInt(Edit6.text);
bb.Width :=c; bb.Height :=c;
k:=0;
d:=c/100;
t:=StrToFloat(Edit3.text);
W:=StrToFloat(Edit4.text);
H:=StrToFloat(Edit5.text);

for l:=1 to 10 do
Wiz1[l]:=1;
for l:=1 to 10 do
Wiz3[l]:=0;

a:=d;
b:=-d;
if b<0 then
st:=FloatToStr(a)+FloatToStr(b)+'i'
else
st:=FloatToStr(a)+'+'+FloatToStr(b)+'i';
Z:=StrToComplex(st);

{Обчислення функції в точці Z}
strz:=Edit1.text;
dest:=StrToComplex('0+0i');


v:=pos('*',strz);
u:=pos('^',strz);
s:=pos('+',strz);
o:=pos('-',strz);

strr:=strz;
kk:=0;



While u<>0 do   
  begin
    kk:=kk+1;
    delete(strr,1,1);
    u:=pos('^',strr);
    s:=pos('+',strr);
    o:=pos('-',strr);
    if ((s<>0) and (s<o)) or ((s<>0) and (o=0)) then
     begin
      Wiz1[kk]:=StrToInt(copy(strr,u+1,s-u-1));
      delete(strr,1,s-1);
     end
    else
    if ((o<>0) and (o<s)) or ((o<>0) and (s=0)) then
     begin
      Wiz1[kk]:=StrToInt(copy(strr,u+1,o-u-1));
      delete(strr,1,o-1);
     end
    else
     begin
      Wiz1[kk]:=StrToInt(copy(strr,u+1,Length(strr)-u));
      delete(strr,1,Length(strr));
     end;
      u:=pos('^',strr);
  end;



strr:=strz;
jj:=0;
v:=pos('*',strz);

While v<>0 do       
  begin
    jj:=jj+1;
    v:=pos('*',strr);
    s:=pos('+',strr);
    o:=pos('-',strr);
    Wiz2[jj]:=StrToFloat(copy(strr,1,v-1));
    delete(strr,1,1);
    v:=pos('*',strr);
    s:=pos('+',strr);
    o:=pos('-',strr);
    if ((s<>0) and (s<o)) or ((s<>0) and (o=0)) then delete(strr,1,s-1)
    else if ((o<>0) and (o<s)) or ((o<>0) and (s=0)) then delete(strr,1,o-1)
    else delete(strr,1,Length(strr));
    v:=pos('*',strr);
    if v=0 then Wiz3[1]:=StrToFloat(copy(strr,1,Length(strr))); {tut}
  end;


for i:=1 to c do
for j:=1 to c do
begin
  dest:=StrToComplex('0+0i');
  poh:=StrToComplex('0+0i');

 if (i=round(c/2)+1) and (j=round(c/2)+1) then
  begin
   bb.Canvas.Pixels[i,j]:=clBlack;
   goto M
  end;

 a:=d+W-t*(j-1);
 b:=-d+H+t*(i-1);
 if b<0 then
 st:=FloatToStr(a)+FloatToStr(b)+'i'
 else
 st:=FloatToStr(a)+'+'+FloatToStr(b)+'i';
 z:=StrToComplex(st); {Точка початку ітерацій}


 for cc:=1 to jj+1  do
 dest:=cSum(cSum(dest,cMul(StrToComplex(FloatToStr(Wiz2[cc])),cPow(z,Wiz1[cc]))),StrToComplex(FloatToStr(Wiz3[cc])));


 for cc:=1 to jj  do
 if Wiz1[cc]=1 then
 poh:=cSum(poh,StrToComplex(FloatToStr(Wiz2[cc]))) else
 poh:=cSum(poh,cMul(cMul(StrToComplex(FloatToStr(Wiz2[cc])),StrToComplex(IntToStr(Wiz1[cc]))),cPow(z,Wiz1[cc]-1)));

 if (Re(poh)=0) and (Im(poh)=0) then
  begin
   bb.Canvas.Pixels[i,j]:=clBlack;
   goto M
  end;


 chast:=cSub(z,cDiv(dest,poh));
 While cAbs(cSub(z,chast))>StrToFloat('0,0000000001') do
  begin
   dest:=StrToComplex('0+0i');
   poh:=StrToComplex('0+0i');
   Z:=chast;


 for cc:=1 to jj+1  do
 dest:=cSum(cSum(dest,cMul(StrToComplex(FloatToStr(Wiz2[cc])),cPow(z,Wiz1[cc]))),StrToComplex(FloatToStr(Wiz3[cc])));

 {парсінг похідного виразу}
 for cc:=1 to jj  do
 if Wiz1[cc]=1 then
 poh:=cSum(poh,StrToComplex(FloatToStr(Wiz2[cc]))) else
 poh:=cSum(poh,cMul(cMul(StrToComplex(FloatToStr(Wiz2[cc])),StrToComplex(IntToStr(Wiz1[cc]))),cPow(z,Wiz1[cc]-1)));
 
   if (Re(poh)=0) and (Im(poh)=0) then
    begin
     bb.Canvas.Pixels[i,j]:=clBlack;
     goto M
    end;

   chast:=cSub(z,cDiv(dest,poh));
   k:=k+1;
   if K>100 then goto R;
  end;

 R:
 P:=1275/StrToInt(Edit2.text);
 l:=round(k*p);

 If  (l>=0) and (l<=255) then
 bb.Canvas.Pixels[i,j]:=rgb(255,l,0);
 If  (l>255) and (l<=510) then
 bb.Canvas.Pixels[i,j]:=rgb(510-l,255,0);
 If  (l>510) and (l<=765) then
 bb.Canvas.Pixels[i,j]:=rgb(0,255,l-510);
 If  (l>765) and (l<=1020) then
 bb.Canvas.Pixels [i,j]:=rgb(0,1020-l,255);
 If  (l>1020) and (l<=1275) then
 bb.Canvas.Pixels[i,j]:=rgb(l-1020,0,255);
 If l>1275 then
 bb.Canvas.Pixels[i,j]:=rgb(0,0,0);
 k:=0;
 M:
end;

Image2.Picture.Bitmap := bb;
bb.SaveToFile(IntToStr(c)+'_'+'z^'+IntToStr(Wiz1[1])+'_'+'z^'+IntToStr(Wiz1[2])+'_'+'z^'+IntToStr(Wiz1[3])+'.bmp');

t2:=GetTickCount;
pos_time:=(t2-t1);

Label1.Caption :=FloatToStr(pos_time);
end;
end
Код


.



Ниже прикрепил модуль Compl - модуль по рпботе над комплексными числами

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  Compl.rar 6,64 Kb
PM MAIL   Вверх
Zozik
Дата 11.8.2008, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 22.7.2008

Репутация: нет
Всего: нет



THandle, Спасибо большое, сумел заменил основную часть StrToХХХ и программа ускорила свою роботу в среднем на 73%. Все StrToХХХ заменить не смог, да и в цыкле их не осталось.  Но от еще большего ускорения я не откажусь smile . 
Если есть идеи посоветуйте)
PM MAIL   Вверх
VICTAR
Дата 11.8.2008, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 10
Всего: 80



Весь код не смотрел, лениво, сорри.
Могу посоветовать заменить Pixels на ScanLine.
PM MAIL   Вверх
THandle
Дата 11.8.2008, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 50
Всего: 372



Zozik, дальше совет VICTAR'а плюс уменьшение количества copy/delete. Они довольно медленно работают smile Подумай, как от них можно избавится. Ну и как сделаешь, выложи получившийся код. Будем дальше смотреть smile 
PM   Вверх
Zozik
Дата 11.8.2008, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 22.7.2008

Репутация: нет
Всего: нет



А где можно почитать про этот ScanLine, а то нашел пару статеек но мало что понял(
PM MAIL   Вверх
VICTAR
Дата 11.8.2008, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 10
Всего: 80



PM MAIL   Вверх
Zozik
Дата 11.8.2008, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 22.7.2008

Репутация: нет
Всего: нет



Убрал Goto, заменил Pixels на ScanLine(+15% ускорение), copy/delete не менял - в цыкле у меня не встречаются, а все что за цыклом времени не занимает(по крайней мере писалось 0 ms). Исчисления в цыкле занимают более чем 90% времени.

Код

unit Beta;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Compl, jpeg, ExtCtrls;


type

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Label1: TLabel;
    Image2: TImage;
    Label2: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
Var
     bm: TBitmap;
     pm: PByteArray;
     Z,chast,dest,poh: TComplex;
     i,j,k,c,l,v,u,s,o,ii,jj,kk,cc,temp,ww:integer;
     a,b,t,d,w,h,p,pos_time:real;
     st,strr,strz:string;
     Wiz1:array [1..10] of integer;
     Wiz2:array [1..10] of real;
     Wiz3:array [1..10] of real;
     t1, t2 : cardinal;
     line : pByteArray;
begin
t1:=GetTickCount;
bm := TBitmap.Create;
bm.PixelFormat := pf24bit;
bm.Width := Form1.ClientWidth;
bm.Height := Form1.ClientHeight;
c:=StrToInt(Edit6.text);
temp:=round(c/2)+1;
k:=0;
P:=1275/StrToInt(Edit2.text);
d:=c/100;
t:=StrToFloat(Edit3.text);
W:=StrToFloat(Edit4.text);
H:=StrToFloat(Edit5.text);

for l:=1 to 10 do
Wiz1[l]:=1;
for l:=1 to 10 do
Wiz3[l]:=0;

a:=d;
b:=-d;
if b<0 then
st:=FloatToStr(a)+FloatToStr(b)+'i'
else
st:=FloatToStr(a)+'+'+FloatToStr(b)+'i';
Z:=StrToComplex(st);


strz:=Edit1.text;
dest:=Complex(0,0);;


v:=pos('*',strz);
u:=pos('^',strz);
s:=pos('+',strz);
o:=pos('-',strz);

strr:=strz;
kk:=0;



While u<>0 do
  begin
    kk:=kk+1;
    delete(strr,1,1);
    u:=pos('^',strr);
    s:=pos('+',strr);
    o:=pos('-',strr);
    if ((s<>0) and (s<o)) or ((s<>0) and (o=0)) then
     begin
      Wiz1[kk]:=StrToInt(copy(strr,u+1,s-u-1));
      delete(strr,1,s-1);
     end
    else
    if ((o<>0) and (o<s)) or ((o<>0) and (s=0)) then
     begin
      Wiz1[kk]:=StrToInt(copy(strr,u+1,o-u-1));
      delete(strr,1,o-1);
     end
    else
     begin
      Wiz1[kk]:=StrToInt(copy(strr,u+1,Length(strr)-u));
      delete(strr,1,Length(strr));
     end;
      u:=pos('^',strr);
  end;



strr:=strz;
jj:=0;
v:=pos('*',strz);

While v<>0 do
  begin
    jj:=jj+1;
    v:=pos('*',strr);
    s:=pos('+',strr);
    o:=pos('-',strr);
    Wiz2[jj]:=StrToFloat(copy(strr,1,v-1));
    delete(strr,1,1);
    v:=pos('*',strr);
    s:=pos('+',strr);
    o:=pos('-',strr);
    if ((s<>0) and (s<o)) or ((s<>0) and (o=0)) then delete(strr,1,s-1)
    else if ((o<>0) and (o<s)) or ((o<>0) and (s=0)) then delete(strr,1,o-1)
    else delete(strr,1,Length(strr));
    v:=pos('*',strr);
    if v=0 then Wiz3[1]:=StrToFloat(copy(strr,1,Length(strr))); {tut}
  end;


{ВОТ начинается цыкл}


for i:=1 to c do
begin
pm := bm.ScanLine[i];
for j:=1 to c do
begin
  dest:=Complex(0,0);
  poh:=Complex(0,0);


 a:=d+W-t*(j-1);
 b:=-d+H+t*(i-1);
 z:=Complex(a,b);


 for cc:=1 to jj+1  do
 dest:=cSum(cSum(dest,cMul(Complex(Wiz2[cc],0),cPow(z,Wiz1[cc]))),Complex(Wiz3[cc],0));


 for cc:=1 to jj  do
 if Wiz1[cc]=1 then
 poh:=cSum(poh,Complex(Wiz2[cc],0)) else
 poh:=cSum(poh,cMul(cMul(Complex(Wiz2[cc],0),Complex(Wiz1[cc],0)),cPow(z,Wiz1[cc]-1)));



 chast:=cSub(z,cDiv(dest,poh));
 While cAbs(cSub(z,chast))>0.0000000001 do
  begin
   dest:=Complex(0,0);
   poh:=Complex(0,0);
   Z:=chast;


 for cc:=1 to jj+1  do
 dest:=cSum(cSum(dest,cMul(Complex(Wiz2[cc],0),cPow(z,Wiz1[cc]))),Complex(Wiz3[cc],0));


 for cc:=1 to jj  do
 if Wiz1[cc]=1 then
 poh:=cSum(poh,Complex(Wiz2[cc],0)) else
 poh:=cSum(poh,cMul(cMul(Complex(Wiz2[cc],0),Complex(Wiz1[cc],0)),cPow(z,Wiz1[cc]-1)));


   chast:=cSub(z,cDiv(dest,poh));
   k:=k+1;
   if K>100 then break;
  end;

 l:=round(k*p);

 If  (l>=0) and (l<=255) then
 begin
   pm^[j*3] := 0;  
   pm^[j*3+1] := l;
   pm^[j*3+2] := 255;
 end;
 If  (l>255) and (l<=510) then
  begin
   pm^[j*3] := 0;
   pm^[j*3+1] := 255;
   pm^[j*3+2] := 510-l;
 end;
 If  (l>510) and (l<=765) then
  begin
   pm^[j*3] := l-510;
   pm^[j*3+1] := 255;
   pm^[j*3+2] := 0;
 end;
 If  (l>765) and (l<=1020) then
  begin
   pm^[j*3] := 255;
   pm^[j*3+1] := 1020-l;
   pm^[j*3+2] := 0;
 end;
 If  (l>1020) and (l<=1275) then
  begin
   pm^[j*3] := 255;
   pm^[j*3+1] := 0;
   pm^[j*3+2] := l-1020;
 end;
 If l>1275 then
  begin
   pm^[j*3] := 0;
   pm^[j*3+1] := 0;
   pm^[j*3+2] := 0;
 end;
 k:=0;

end;
end;
{ТУТ цыкл заканчивается}


t2:=GetTickCount;
Form1.Canvas.Draw(0, 0, bm);
pos_time:=(t2-t1);

Label1.Caption :=FloatToStr(pos_time);
end;
end.  


Это сообщение отредактировал(а) Zozik - 11.8.2008, 17:54
PM MAIL   Вверх
THandle
Дата 11.8.2008, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 50
Всего: 372



Zozik, там уже практически никак не ускоришь. Так как там все занимают довольно сложные вычисления. В них уж разбираться только тебе smile  Там можно только упростить их пробовать, но чтобы вникнуть во все это надо быть либо вавтором кода, либо это займет довольно длительное время.

Можно все деления, умножения заменить на сдвиг, ноя не думаю что это сильно ускорит.

Оставшиеся 10% ускорить можно, убрав из циклов while copy/delete/pos.

Да, и еще, слово "цыкл" пишется через "и". smile 
PM   Вверх
Coder
Дата 12.8.2008, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: 2
Всего: 11



Цитата(Zozik @  12.8.2008,  01:41 Найти цитируемый пост)
copy/delete не менял - в цыкле у меня не встречаются

а while это не цикл?

обязательно избавься от delete. Для чего можешь почитать тут - http://forum.vingrad.ru/forum/topic-210801/unread-1.html
PM MAIL   Вверх
Zozik
Дата 12.8.2008, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 22.7.2008

Репутация: нет
Всего: нет



Coder,  Я имел ввиду главный цикл. В том цикле где встречается delete/copy много считать не нужно, гдето 2-3 раза(засекал время - писалось 0 ms). Ну потом исправлю если получется, попозже.

 
VICTAR, 
THandle, 
Coder, Всем большое спасибо!)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0676 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.