AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Programmoptimierung

Offene Frage von "HansDampf43"
Ein Thema von HansDampf43 · begonnen am 5. Mär 2010 · letzter Beitrag vom 8. Mär 2010
Antwort Antwort
Seite 2 von 2     12   
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#11

Re: Programmoptimierung

  Alt 7. Mär 2010, 14:05
Zitat von Wannebee:
Wobei man sagen muss das Subroutinen/Funktionen nicht immer schneller sind (zumindest bei D7 nicht).
Wie soll denn der Aufruf einer Funktion jemals schneller sein? Es sind schließlich zusätzliche Befehle notwendig, um die Parameter auf den Stack zu schieben, die Routine aufzurufen, usw. Theoretisch könnte man durch Codeverkürzung (Funktionsaufrufe) erreichen, das der gesamte Code im Cache landet, das geht soweit ich weiss aber nur bei sehr kompakten Routinen.

'Schneller' ist man hier nicht im Programmablauf, sondern -wie DeddyH schon sagte- in der Wartung und Pflege.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#12

Re: Programmoptimierung

  Alt 7. Mär 2010, 14:21
Mal zum Vergleich (ließe sich noch weiter kürzen):
Delphi-Quellcode:
function XInRange: Boolean;
begin
  Result := (image2.left>geister[i].left) and (image2.left<geister[i].left+30) or
            (image2.left+26>geister[i].left) and (image2.left+26<geister[i].left+30);
end;

function YInRange: Boolean;
begin
  Result := (image2.top>geister[i].top) and (image2.top<geister[i].top+30) or
            (image2.top+26>geister[i].top) and (image2.top+26<geister[i].top+30);
end;

...

for i:= 1 to anzahl do
  begin
    if existiert[i] then
      if XInRange and YInRange then
        begin
          geister[i].free;
          existiert[i]:=false;
        end;
  end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.754 Beiträge
 
Delphi 10.4 Sydney
 
#13

Re: Programmoptimierung

  Alt 7. Mär 2010, 14:35
Zitat von DeddyH:
Mal zum Vergleich (ließe sich noch weiter kürzen):[delphi]function XInRange: Boolean;
begin
Result := (image2.left>geister[i].left) and (image2.left<geister[i].left+30) or
(image2.left+26>geister[i].left) and (image2.left+26<geister[i].left+30);
end;

function YInRange: Boolean;
begin
Result := (image2.top>geister[i].top) and (image2.top<geister[i].top+30) or
(image2.top+26>geister[i].top) and (image2.top+26<geister[i].top+30);
end;
.. wobei ich es "hübscher" finden würde wenn xInRange und yInRange die
zu vergleichenden Images und Geister als Parameter übergeben bekämen.

Beispiel:
Code:
function xInRange(AImage: TImage; AGeist:TGeist);
Man könnte dann gleich am Aufruf sehen was verglichen wird.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#14

Re: Programmoptimierung

  Alt 7. Mär 2010, 14:37
Sicherlich, aber da das sowieso als Unterroutine gedacht war, hab ich mir das gespart.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#15

Re: Programmoptimierung

  Alt 8. Mär 2010, 06:50
So, und wenn wir schon beim Fiddelkram sind:
1. Wieso heißt das 'XinRange', wenn doch in der Funktion gar kein 'X' vorkommt?
2. Selbst bei 'LeftInRange' blieben noch Zweifel, ob es das ist, was die Funktion prüft.
3. Und was sind das für magische Zahlen '30' und '26'?

Mein Refactoring würde so aussehen:
Delphi-Quellcode:
Function InRange (aNumber, aLowBound, aHighBound : Integer) : Boolean;
Begin
  Result := (aNumber >= aLowBound) and (aNumber <= aHighBound);
End;

Function PointInImage (aPoint : TPoint; aImage : TImage) : Boolean;
Begin
// Ich gehe mal davon aus, das die '30' die Breite und Höhe des Bildes sind
  Result := InRange (aPoint.X, aImage.Left, aImage.Left + aImage.Width)
        and InRange (aPoint.Y, aImage.Top, aImage.Top + aImage.Height)
End;

Function SpriteInImage (aSprite, aImage : TImage) : Boolean;
// Ich gehe davon aus, das die '26' die Breite und Höhe des Sprites sind
Begin
  Result := PointInImage (aSprite.BoundsRect.TopLeft)
        Or PointInImage (aSprit.BoundsRect.BottomRight);
End;

...
for i:= 1 to anzahl do begin
  if existiert[i] then
    if SpriteInImage (Image2, geister[i]) then begin
      geister[i].free;
      existiert[i]:=false;
    end;
end;
Kann aber auch sein, das ich den Code nicht verstanden habe. Wär' ja nicht das erste Mal
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz