flashgameblog.at

01.11.2009
00:28

If-Statement beschleunigen 1

Während der Entwicklung eines Codes entstehen gerne angsteinflößend große If-Bedigungen. In der Entstehungsphase ist das OK. Zum Abschluss eines Projektes sollte man sich dieser Codeteile jedoch noch einmal annehmen, da hier sehr oft die Ausführungsgeschwindigkeit wesentlich erhöht werden kann.

Die ganze Thematik fällt in den Bereich der Bool’schen Algebra. de.wikipedia.org/wiki/Boolesche_Algebra

Ich portiere derzeit ein Spriteframework von AS2 nach AS3. Hier bin ich auf eine Funktion gestoßen, die prüft, ob ein Punkt ein Sprite berührt. An diesem Beispiel möchte ich vorführen, wie eine solche Optimierung durchgeführt werden kann.


Diese Version habe ich vorgefunden:

 

  1. protected function pointInSprite2(sprite:AdvancedSprite, x:int, y:int):Boolean {
  2.   if (
  3.     x >= sprite.x && x <= sprite.x + sprite.width
  4.     &&
  5.     y >= sprite.y && y <= sprite.y + sprite.height
  6.   )
  7.     return true;
  8.   else 
  9.     return false;
  10. }

 

Logisch arbeitet diese Funktion korrekt, jedoch kann das gleiche Ergebnis mit weniger Aufwand erzielt werden. In der If-Bedingung finden wir vier Teilbedingungen. NUR wenn alle vier Teilbedingungen erfüllt sind ist die gesamte Bedingung erfüllt. Diese Codestruktur führt dazu, dass bei jedem Aufruf immer alle vier Teilbedingungen ausgewertet werden müssen, was Rechenzeit in Anspruch nimmt.


Wie sieht die Optimierung aus?

Im Grunde drehen wir die Prüfung um(Negation). Sobald eine Teilbedingung nicht erfüllt ist, können wir auf weitere Prüfungen verzichten, da durch eine UND-Verknüpfung das Gesamtergebnis gar nicht mehr Wahr sein kann.

Die Optimierung erfolgt in zwei Schritten:

1. Negation

 

  1. protected function pointInSprite2(sprite:AdvancedSprite, x:int, y:int):Boolean {
  2.   if (
  3.     x < sprite.x || x > sprite.x + sprite.width
  4.     ||
  5.     y < sprite.y || y > sprite.y + sprite.height
  6.   )
  7.     return false;
  8.   else 
  9.     return true;
  10. }

 

2. Auflösung der ODER-Verknüpfung

Durch die Auflösung der ODER-Verknüpfung werden Codeteile dupliziert(hier: "return false;"). Hier muss man von Fall zu Fall entscheiden, ob die Codevergrößerung durch die gewonnene Geschwindigkeit gerechtfertigt ist. In diesem Beispiel kommt erst durch diese Auflösung der Geschwindigkeitsgewinn zu Stande!

 

  1. protected function pointInSprite2(sprite:AdvancedSprite, x:int, y:int):Boolean {
  2.   if ( x < sprite.x )
  3.     return false;
  4.  
  5.   if ( y < sprite.y ) // Diese Prüfung wurde vorverlegt. Somit bleibt manche Addition erspart.
  6.         return false;
  7.  
  8.   if ( x > sprite.x + sprite.width )
  9.     return false;
  10.  
  11.   if ( y > sprite.y + sprite.height )
  12.     return false;
  13.        
  14.   return true;
  15. }

 

Die logischen Ergebnisse der beiden Versionen sind ident. Bei der optimierten Version, wird die durchschnittliche Ausführungsdauer jedoch geringer sein. Sollte sich der Punkt genau unter dem Sprite befinden, werden wieder alle vier Bedingungen geprüft, d. h.: In diesem einen Fall werden wir kaum Zeit gut machen können, in allen anderen jedoch schon. Wenn man es ganz genau nimmt, haben wir auch in der einen Situation Zeit gewonnen, da die UND-Verknüpfung der Teilbedingungen entfällt. Diese Ersparnis kann jedoch vernachlässigt werden.

In diesem Beispiel sind die optimierte und die nicht optimierte Version in etwa gleich lang. Es kann durchaus passieren das der optimierte Quellcode länger wird. Schließlich optimieren wir auf geringe Ausführungsgeschwindigkeit und nicht auf geringe Codegröße.

  •  
  • Trackbacks
  •  
html flash games
24.08.2010
12:02
html flash games

[...] in this post flashgameblog.at discussing html flash games, proposes a new way to look at html flash games [...]...

html flash games
24.08.2010
12:02
html flash games

[...] another blog on html flash games, wrote a post flashgameblog.at, discussing html flash games [...]...

  •  
  • 0 Comments
  •  

Your comment

Notify me when someone adds another comment to this post

back

< < November 2009 > >
S M T W T F S
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 26 27 28
29 30          

Blog rolls

Latest Comments

ISO Blender Camera Setup
24.04.2010 06:58
update
21.03.2010 01:15
if-Statement
16.11.2009 08:34
hmm...
16.11.2009 08:00

Archive

  • [-]2010(8)
    • [-]August(1)
    • [-]July(1)
    • [-]June(2)
    • [-]April(1)
    • [-]March(2)
    • [-]February(1)
  • [-]2009(13)
    • [-]December(4)
    • [-]November(8)
    • [-]October(1)

Copy and paste this link into your RSS news reader

RSS 0.91Posts
RSS 2.0Posts

Social Bookmarking

Bookmark bei: Mr. Wong Bookmark bei: Webnews Bookmark bei: Icio Bookmark bei: Oneview Bookmark bei: Linkarena Bookmark bei: Favoriten Bookmark bei: Seekxl Bookmark bei: Favit Bookmark bei: Social Bookmarking Tool Bookmark bei: Power Oldie Bookmark bei: Bookmarks.cc Bookmark bei: Newskick Bookmark bei: Newsider Bookmark bei: Linksilo Bookmark bei: Readster Bookmark bei: Folkd Bookmark bei: Yigg Bookmark bei: Digg Bookmark bei: Del.icio.us Bookmark bei: Reddit Bookmark bei: Simpy Bookmark bei: StumbleUpon Bookmark bei: Slashdot Bookmark bei: Netscape Bookmark bei: Furl Bookmark bei: Yahoo Bookmark bei: Spurl Bookmark bei: Google Bookmark bei: Blinklist Bookmark bei: Blogmarks Bookmark bei: Diigo Bookmark bei: Technorati Bookmark bei: Newsvine Bookmark bei: Blinkbits Bookmark bei: Ma.Gnolia Bookmark bei: Smarking Bookmark bei: Netvouz Information