flashgameblog.at

11.11.2009
01:29

If-Statement beschleunigen 2 b

Im ersten Teil dieses Posts haben wir uns eine Umgebung gebaut in der wir

 

  1. messen können, ob unser Code schneller läuft und
  2. ob der Code nach der Optimierung immer noch das gleiche tut.

 

Wir haben also unser Labor aufgebaut und nun können wir mit der Arbeit beginnen.

Hier noch mal der originale Code:

 

  1. if(
  2.   (! (diodeMidLeft & 1) && ( !climbing || !ladderMidRight && climbing ) )
  3.   ||
  4.   (! (diodeTopLeft & 1) && ( !climbing || !ladderTopLeft  && climbing ) )
  5. )
  6.   return true;
  7. else
  8.   return false;
  9. }
  10.  

 

Oder-Verknüpfung aufgelöst:

 

  1. if(! (diodeMidLeft & 1) && ( !climbing || !ladderMidRight && climbing ) )
  2.   return true;
  3.  
  4. if(! (diodeTopLeft & 1) && ( !climbing || !ladderTopLeft  && climbing ) )
  5.   return true;
  6.  
  7. return false;
  8.  

 

Als zweiten Schritt können wir auch die UND-Verknüpfung auflösen:

 

  1. if(! (diodeMidLeft & 1) )
  2.   if( !climbing || !ladderMidRight && climbing )
  3.     return true;
  4.  
  5. if(! (diodeTopLeft & 1) )
  6.   if( !climbing || !ladderTopLeft  && climbing )
  7.     return true;
  8.  
  9. return false;
  10.  

 

Nun haben wir wieder eine Oder-Verknüpfung:

 

  1. if(! (diodeMidLeft & 1) ){
  2.   if( !climbing )
  3.     return true;
  4.   if( !ladderMidRight && climbing )
  5.     return true;
  6. }
  7.    
  8. if(! (diodeTopLeft & 1) ){
  9.   if( !climbing)
  10.     return true;
  11.   if( !ladderTopLeft  && climbing )
  12.     return true;
  13.  
  14. }
  15.  
  16. return false;
  17.  

 

Und schließlich noch mal eine Und-Verknüpfung:

 

  1. if(! (diodeMidLeft & 1) ){
  2.   if( !climbing )
  3.     return true;
  4.   if( !ladderMidRight)
  5.     if( climbing )
  6.       return true;
  7. }
  8.    
  9. if(! (diodeTopLeft & 1) ){
  10.   if( !climbing)
  11.     return true;
  12.   if( !ladderTopLeft)
  13.     if( climbing )
  14.       return true;
  15.  
  16. }
  17.  
  18. return false;
  19.  

 

Das war's.

 

Wie und wann kann man Auflösen?

 

ODER

 

  1. if(A || B || C)
  2.   foo();
  3.  
  4. // ist das selbe wie
  5. if(A)
  6.   foo();
  7. else if(B)
  8.   foo();
  9. else if(C)
  10.   foo;
  11.  

 

"Else if" ist hier notwendig um eine mehrfache Ausführung von foo zu verhindern. Würde statt foo die Funktion mit return verlassen werden, könnte man einfache If-Anweisungen unter einander schreiben, da der Code nach return ohnedies nicht mehr ausgeführt werden würde

 

  1. if(A || B || C)
  2.   return true;
  3.  
  4. // ist das selbe wie
  5. if(A)
  6.   return true;
  7. if(B)
  8.   return true;
  9. if(C)
  10.   return true;
  11.  

 

UND

 

  1. if(A && B && C)
  2.   foo();
  3.  
  4. // ist das selbe wie
  5. if(A)
  6.   if(B)
  7.     if(C)
  8.       foo();
  9.  

 

Problematisch sind If-Anweisungen, die eine Else-Klause besitzen und die "nur" Code ausführen ohne den Code mit return verlassen. Hier sind nur sehr selten Auflösungen möglich.

 

Fazit:

 

Ich habe hier grundlegend die Möglichkeit der Optimierug ausgezeigt. Wir haben jedoch auch gesehen, dass der, dazu nötige, Aufwand nicht zu unterschätzen ist und die Beschleunigung unter Umständen nicht sehr groß ist. Bei mir lief der optimierte Code um 7 Millisekunden schneller (Bitte nicht übersehen, dass er 1.000.000 mal ausgeführt wird). Deshalb sollte man sich genau überlegen ob und an welchen Funktionen im eigenen Code man Hand anlegen sollte. Natürlich kommen die Funktionen, die am häufigsten ausgeführt werden am ehesten in Frage.

 

Ich habe im ersten Teil erwähnt, dass ich den Beispielcode gekürzt habe, da wir sonst über 2.000 Prüfungsfälle gehabt hätten. Ein Array mit 2000 Prüfungsfällen schreibt man natürlich nich von Hand. Hier schreibt man sich ein kurzes Programm, das das gewünschte Array ausgibt. Wenn man dieses Programm nicht schreiben kann oder will, kann man auch einen "brute-force" Angriff auf die Funktion starten. Hierbei erzeugt man die einzelnen Parameter zufällig und lässt den Test so lange laufen, bis wahrscheinlich alle Testfälle ausgeführt wurden. Ich halte die zweite Möglichkeit für eher unprofessionell und rate davon ab!

  •  
  • 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

Blur Filter
17.01.2011 11:01
ISO FTW!
18.09.2010 20:17
ISO Blender Camera Setup
24.04.2010 06:58
update
21.03.2010 01:15

Archive

  • [-]2010(9)
    • [-]November(1)
    • [-]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