Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 04-01-2008, 10:47   #1 (permalink)
°.oO°O.o°.oO.o°O
 
Benutzerbild von bamboocha
 
Registriert seit: Jun 2005
Ort: CH
Beiträge: 1.490
Performance-Optimierung

Hi zusammen

Ich habs tatsächlich geschafft und über die Festtage mal ein bisschen in Moock's Essential AS2.0 reingelesen. Dabei ist mir aufgefallen, dass er bei Schleifen häufig ein Konstrukt in dieser Art verwendet:
Code:
    for(var i:Number = array.length; --i >= 0;)
Total aus den Wolken gefallen von dieser Schreibweise (), habe ich begonnen, mich zu fragen, wieviel Performanceunterschied hier wohl zu einer "normalen" for-Schleife oder einer while-Schleife besteht. Mein nächster Schritt bestand dann darin, hier im Forum mal nach Optimierung und Performance zu suchen - und leider nur Threads zu vereinzelten Themen zu finden, aber nix, was alles schön zusammenträgt. Mir ist durchaus bewusst, dass Optimierungen (bei gut geschriebenem oder besonders hässlichem Code) in den seltensten Fällen wirklich merkbare Performanceverbesserungen bringt (und die ganze Sache Optimierungs-Sache unter Umständen als "sinnlos" betrachtet werden kann). Trotzdem würde mich interessieren, wie bzw. mit was alle möglichen solchen Verbesserung erreicht werden können?

Hat vielleicht jemand nen guten Link, den ich nicht gefunden habe oder möchte jemand ein paar Beispiele machen, die (vielleicht nicht nur für mich?) interessant sind?
__________________
There is no way to happiness, happiness is the way! - Buddha
bamboocha ist offline   Mit Zitat antworten
Alt 04-01-2008, 10:56   #2 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Bremen
Beiträge: 13.382
Sowas ist schwer zu sagen. Vor allen Dingen wenn man den Kontext des Codes nicht kennt. Manchmal hat das auch rein pragmatische Gründe oder Schleifen müssen gar so aufgebaut werden.

Zu alten ActionScript 1 Zeiten war es beispielsweise performanter ähnliche Konstrukte zu verwenden, da eine Typprüfung zwischen Number und String bei + oder += Operatoren zur Laufzeit durchgeführt wurden. Programmiert nach Actionscript 2 mit entsprechenenden Konventionen entfallen diese Prüfungen aber schon von vorne rein.
Omega Psi ist offline   Mit Zitat antworten
Alt 04-01-2008, 11:08   #3 (permalink)
ChronoGuard
 
Benutzerbild von SpecOps-12
 
Registriert seit: Mar 2002
Ort: Saarbrücken
Beiträge: 2.654
Moock umgeht damit, dass einmal pro Schleifendurchlauf die array-Länge abgeprüft wird, was ja auch in der Flash-Hilfe als zu vermeiden beschrieben wird.

Auf alle Fälle cool, hab ich so auch noch nicht gesehn.

Ich hab immer Mühsam Konstrukte wie
PHP-Code:
var meinArray_length:Number meinArray.length
for (var i:Number 0i<meinArray_lengthi++) 
erstellt.
__________________
we will stop enhancing the truth in 3, 2, ...
SpecOps-12 ist offline   Mit Zitat antworten
Alt 04-01-2008, 15:22   #4 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
Registriert seit: Mar 2006
Beiträge: 1.573
mich würd mla interessieren ob be einem 1D-Array ein while-Durchlauf schneller ist?

also ich mache seit neustem es immer so auch beim zuweisen:
Code:
    var n : uint = meinArray.length(); while( n-- ) {   // zuweisung o.ä }

anstatt des mühsamens for.
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi
_crypto_ ist offline   Mit Zitat antworten
Alt 04-01-2008, 20:26   #5 (permalink)
l2l|c4o
 
Benutzerbild von Sir Freako
 
Registriert seit: Nov 2005
Ort: düstere Grotte im Süden
Beiträge: 1.268
Zitat:
Zitat von Weidler Beitrag anzeigen
Moock umgeht damit, dass einmal pro Schleifendurchlauf die array-Länge abgeprüft wird, was ja auch in der Flash-Hilfe als zu vermeiden beschrieben wird.

Auf alle Fälle cool, hab ich so auch noch nicht gesehn.

Ich hab immer Mühsam Konstrukte wie
PHP-Code:
var meinArray_length:Number meinArray.length
for (var i:Number 0i<meinArray_lengthi++) 
erstellt.
Hi ,

was ich mich gerade frage ist es nicht Jacke wie Hose
ob ich nun in jeder durchlauf i checke oder ob ich immer decrement i >0
überprüfe das muß schon auch jedesmal gecheckt werden.

Wie schon gesagt das muß man immer im context mit der funktion betrachten
Ich konnte da aufjedenfall auch noch keinen Performance unteschied feststellen

Geändert von Sir Freako (04-01-2008 um 20:29 Uhr)
Sir Freako ist offline   Mit Zitat antworten
Alt 06-01-2008, 22:03   #6 (permalink)
DeRailed
 
Benutzerbild von klickverbot
 
Registriert seit: Sep 2006
Beiträge: 321
Ich habe vor einiger Zeit die verschiedenen Möglichkeiten, Schleifen zu programmieren, gegeneinander antreten lassen (AS2!), weil es in einem speizellen Fall auf das letzte Quäntchen Geschwindigkeit ankam. Es ergaben sich Unterschiede im einstelligen Prozentbereich. Die detaillierten Ergebnisse habe ich unten als Tabelle angehängt.

Jedenfalls war diese Variante, über ein Array zu iterieren, am schnellsten:
Code:
    var i :Number = array.length;while ( --i > -1 ) {    array[ i ].doNothing();}

Allerdings findet in dieser Schleife nur ein Zugriff auf das Element statt. Ich könnte mir vorstellen, dass die zweitplazierte Variante bei mehreren Zugriffen schneller ist:
Code:
    var currentObject :DoNothing;var i :Number = array.length;while ( currentObject = array[ --i ] ) {    currentObject.doNothing();}
Sie braucht zwar eine Zeile mehr, hat aber in der Praxis den angenehmen Vorteil, dass currentObject typisiert ist und man so die Auto Completion-Hilfen der IDE nutzen kann.

Gegen diese Variante habe ich jetzt noch die Version von Moock antreten lassen. Sie war um ca. 2% langsamer.

Jedenfalls sind die Unterschiede in der Praxis wohl nur äußerst selten relevant. Wenn jemand gerade zu viel Zeit hat, dann könnte er ja die Versuche für AS3 wiederholen, da gibt es ja doch mehr performancekritische Anwendungen als bei AS2. Allerdings könnten da natürlich auch die Schleifen so gut optimiert sein, dass die reine Schleifenlaufzeit überhaupt nicht mehr ins Gewicht fällt.

Daher die Moral von der Geschicht': Um Schleifenoptimierung sorg' dich nicht.
Angehängte Dateien
Dateityp: pdf results.pdf (23,2 KB, 26x aufgerufen)
__________________
Zum Thema Code im Forum posten:
Mit den [AS]-Tags bekommt man eine tolle farbige Anzeige, bei der sogar die Zeilennummern eingetragen sind.

Wie man aus [AS]-Tags Code direkt ohne die Zeilennummern kopiert:
Einfach auf den 'Beitrag zitieren'-Knopf drücken und Spaß mit Copy&Paste haben ;)
klickverbot ist offline   Mit Zitat antworten
Alt 07-01-2008, 09:57   #7 (permalink)
Crème brûlée
 
Registriert seit: Jan 2006
Ort: Düsseldorf
Beiträge: 724
Zum Thema AS3 habe ich erfahren (aber noch nicht getestet), dass diese Variante am schnellsten ist:

PHP-Code:
var i:int 0;
var 
l:int meinArray.length;
for (; 
l+= 1){
  
meinArray[i] = 12;

also sprich:
  • immer int als Arrayzugriff benutzen
  • Arraylänge außerhalb des Loops in eine Variable speichern
  • Schleifenzähler außerhalb des Loops initialisieren
  • i += 1 statt i++ verwenden
laxersaz ist offline   Mit Zitat antworten
Alt 07-01-2008, 10:58   #8 (permalink)
\x3a\x6f\x29
 
Benutzerbild von [je]
 
Registriert seit: Apr 2004
Ort: paris
Beiträge: 806
++i statt i+=1 muss das heißen.

i+=1 ist sogar viel schlimmer als i++, da 1 in dem Fall erst eine Number ist, die zu int konvertiert wird und dann addiert wird. Oder auch möglich: Die Addition findet mit zwei Number Typen statt und dann wird das zu int konvertiert. Beide Fälle willst du nicht
__________________
joa ebert
http://blog.joa-ebert.com/ - http://www.joa-ebert.com/
[je] ist offline   Mit Zitat antworten
Alt 07-01-2008, 11:11   #9 (permalink)
Crème brûlée
 
Registriert seit: Jan 2006
Ort: Düsseldorf
Beiträge: 724
Ich habe gerade gelesen, dass der schnellste AS3-Loop dieser hier sein soll:

PHP-Code:
var k;
while (
–i -(-1)) {} 
laxersaz ist offline   Mit Zitat antworten
Alt 07-01-2008, 12:03   #10 (permalink)
DeRailed
 
Benutzerbild von klickverbot
 
Registriert seit: Sep 2006
Beiträge: 321
Zitat:
Zitat von laxersaz Beitrag anzeigen
Ich habe gerade gelesen, dass der schnellste AS3-Loop dieser hier sein soll:

PHP-Code:
var k;
while (
–i -(-1)) {} 
Da fehlt aber einiges...
__________________
Zum Thema Code im Forum posten:
Mit den [AS]-Tags bekommt man eine tolle farbige Anzeige, bei der sogar die Zeilennummern eingetragen sind.

Wie man aus [AS]-Tags Code direkt ohne die Zeilennummern kopiert:
Einfach auf den 'Beitrag zitieren'-Knopf drücken und Spaß mit Copy&Paste haben ;)
klickverbot ist offline   Mit Zitat antworten
Alt 07-01-2008, 17:56   #11 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
Registriert seit: Mar 2006
Beiträge: 1.573
Zitat:
Zitat von laxersaz Beitrag anzeigen
also sprich:
  • immer int als Arrayzugriff benutzen
  • Arraylänge außerhalb des Loops in eine Variable speichern
  • Schleifenzähler außerhalb des Loops initialisieren
  • i += 1 statt i++ verwenden
lieber unsigned integer erspart nochmal arbeit.
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi
_crypto_ ist offline   Mit Zitat antworten
Alt 07-01-2008, 18:15   #12 (permalink)
Raven-Kid
 
Benutzerbild von [RK]
 
Registriert seit: Feb 2006
Beiträge: 350
Zitat:
Zitat von laxersaz Beitrag anzeigen
Ich habe gerade gelesen, dass der schnellste AS3-Loop dieser hier sein soll:

PHP-Code:
var k;
while (
–i -(-1)) {} 
Quelle? Würde mich schon interessieren ...
[RK] ist offline   Mit Zitat antworten
Alt 07-01-2008, 18:30   #13 (permalink)
DeRailed
 
Benutzerbild von klickverbot
 
Registriert seit: Sep 2006
Beiträge: 321
Zitat:
Zitat von _crypto_ Beitrag anzeigen
lieber unsigned integer erspart nochmal arbeit.
Eine Menge Blog- und Foren-Autoren sind zu dem Ergebnis gekommen, dass uint im Regelfall um einiges langsamer als int ist. Allerdings kann sich daran mit den neuen Flash Player-Versionen auch etwas geändert haben, die meisten Tests sind schon mehr als ein Jahr alt.
__________________
Zum Thema Code im Forum posten:
Mit den [AS]-Tags bekommt man eine tolle farbige Anzeige, bei der sogar die Zeilennummern eingetragen sind.

Wie man aus [AS]-Tags Code direkt ohne die Zeilennummern kopiert:
Einfach auf den 'Beitrag zitieren'-Knopf drücken und Spaß mit Copy&Paste haben ;)
klickverbot ist offline   Mit Zitat antworten
Alt 07-01-2008, 18:41   #14 (permalink)
\x3a\x6f\x29
 
Benutzerbild von [je]
 
Registriert seit: Apr 2004
Ort: paris
Beiträge: 806
Nein. Das ist eine Compiler Frage. Und ich kann sie auch gern beantworten.
uint ist ein GRAUS, weil(!) es gibt in Flash keine unsigned Datentypen (Java lässt grüßen) und der uint ist nur eine Number ohne den Floating Point Part quasi.

Bei jeder Berechnung mit einem uint wird der uint erst zu einer Number konvertiert, dann Number-technisch addiert und dann zu einem uint wieder konvertiert.

Das steht auch genauso im Bytecode. Daher uint gleich wieder vergessen
__________________
joa ebert
http://blog.joa-ebert.com/ - http://www.joa-ebert.com/
[je] ist offline   Mit Zitat antworten
Alt 07-01-2008, 18:46   #15 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Bremen
Beiträge: 13.382
Witzig. Danke für die Info.
Omega Psi ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

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



Alle Zeitangaben in WEZ +1. Es ist jetzt 03:23 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2014 Marc Thiele