Entwickler-Ecke

Algorithmen, Optimierung und Assembler - längere Laufzeiten bei Funktionsaufrufen mit bitmaps


paintman81 - Do 23.12.04 02:00
Titel: längere Laufzeiten bei Funktionsaufrufen mit bitmaps
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:


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:


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,...)


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.


Delete - 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.