Autor Beitrag
paintman81
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Do 23.12.04 02:00 
Hallo,

ich versuche grad ein Programm von mir zu optimieren und teste die laufzeiten von meinen einzelnen Funktionen indem ich jede ein paar mal aufrufe und die gesamtzeit ausgeben lasse. Also ich hab das Problem das die beiden Funktionen einzeln aufgerufen ziemlich schnell (ca. 500 ms für 1000 aufrufe abgearbeitet werden). Allerdings wenn ich beide hintereinandere aufrufe wird die laufzeit nicht nur verdoppelt, sondern fast verhundertfacht:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
   bitmap:=tbitmap.create;

   start:=now;
   for i:=0 to 1000 do
   begin
      bildschirmfoto(bitmap);
      auswertung(Bitmap);
   end;

   button1.caption:=inttostr(millisecondsbetween(now,start));
   bitmap.free;


die Prozedur bildschirmfoto soll nur ein Bildschirmfoto in einer bestimmten größe liefern:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
procedure TForm1.bildschirmfoto(var result:tbitmap);
var rect1,rect2:trect;
 cv:tcanvas;
r : TRect;
bitmap2:tbitmap;
begin
   cv:=TCanvas.Create;
   cv.Handle:=GetWindowDC(GetDesktopWindow);
   r:=Rect(0,0,Screen.Width,Screen.Height);
   result.Width:=Screen.Width;
   result.Height:=Screen.Height;


   hoch:=302;
   breit:=296;

   rect1:=rect(0,0,breit,hoch);
   rect2:=rect(0,0,rect1.right-rect1.left,rect1.Bottom-rect1.Top);

   result.Canvas.CopyRect(rect2,cv,rect1);

   ReleaseDC(0,cv.Handle);
   cv.Free;

end;


Und bei auswertung wird dieses Bild dann ausgewertet, mit einem Scanlinebefehl und dann einigen inc(zeiger1,...)

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function tform1.auswertung(var bitmap:tbitmap):boolean;
var
oben:integer;
zeiger1: pcolor;
begin
   if bitmap.PixelFormat <> pf32bit then
      bitmap.PixelFormat := pf32bit;

   if (Bitmap.Width<=0) or (Bitmap.Height<=0) then
      exit;

   oben:=15;
   zeiger1:=bitmap.ScanLine[oben];

   ...

end;


Also nochmal: einzeln laufen die Prozeduren extrem schnell nur wenn ich sie halt hintereinander (mit dem gleichen Bitmap) aufrufe, wirds extrem langsam.
Kann mir das jemand erklären und evt. einen Verbesserunsgvorschlag machen?!

Vielen Dank.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 23.12.04 04:50 
Nenn den Parameter von deiner Screenshot-Prozedur mal anders. result ist eine Delphi interne Variable, die Rückgabewerte von Funktionen beinhaltet.