Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 04-01-2012, 12:51   #1 (permalink)
Neuer User
 
Registriert seit: Sep 2006
Beiträge: 620
Preformance Problem in For-Schleife (XML Verarbeitung)

Hallo zusammen.

Ich hätte da mal ne Frage bezüglich Preformanceoptimierung. Ich lade eine große Anzahl an XML-Einträgen aus meiner Datenbank (momentan 1500+ Einträge mit jeweils ca 85 Werten)

Die Daten werden in Flash auch sehr zügig geladen. Allerdings muss ich die Daten ja noch weiterverarbeiten...

Wenn ich die Daten über eine Schleife einen Objekt zuweise und dieses in ein Array packe dauert die Zuweisung ca 10 Sekunden.
Ohne die Schleife dauert der Vorgang (Daten laden + einer XML in Flash zuweisen) weniger als eine Sekunde...

Gibt es eine Möglichkeit die Daten schneller zu verarbeiten?

Anbei mal mein momentanes Vorgehen.

PHP-Code:
//...  Daten wurden bereits geladen und der ergebnisXML zugewiesen

for(var i:int=0i<ergebnisXML.children().length(); i++){   // ca 1500 Durchläufe
    
produkt = new Object();
    
produkt.id ergebnisXML.children()[i].id.toString();
    
produkt.produkt ergebnisXML.children()[i].produkt.toString();
    
produkt.bearbeiter ergebnisXML.children()[i].bearbeiter.toString();
    
produkt.datum ergebnisXML.children()[i].datum.toString();
        
//... ca 80 weitere Zuweisungen 
Über amfPHP möchte ich nicht unbedingt gehen falls es anders auch möglich ist.

Ich habe mir schon überlegt die entsprechenden Zuweisungen so zu reduzieren, das diese nur für das jeweilige Produkt passen. Dann hätte ich keine undefined-Werte und müsste auch weniger schreiben.
Allerdings dauert die Zuweisung mit nur 10 Zuweisungen auch noch über eine Sekunde und ein Produkt hat min. 30 Zuweisungen.

Gibt es eine bessere Möglichkeit die Daten aus der XML (bzw. aus dem HTTPService) den Objekten zuzuweisen? Oder sollte ich mich jeweils auf das Notwendigste beschränken und dafür viele verschiedene Zuweisungsschleifen erstellen?

MfG Monk
__________________
Flash CS5 / Flex 3 / Flashdevelop / FB 4.6
dr monk ist gerade online   Mit Zitat antworten
Alt 04-01-2012, 17:04   #2 (permalink)
in the boondocks
 
Benutzerbild von shin10
 
Registriert seit: Feb 2006
Ort: Augsburg
Beiträge: 3.496
80 x 1500? das sind dann ja 120.000 Anweisungen. Du zeigst doch nie und nimmer 1500 Produkte auf einmal. Reduzier dass im ersten Durchlauf auf die sichtbaren Produkte und mach nur bei Bedarf einen weiteren Durchlauf oder den Rest asynchron.

Außerdem solltest du eine Klasse für das Produkt erstellen. Das dürfte dann auch nochmal schneller sein als Object.

mfg

sx
__________________

flintfabrik.de
shin10 ist offline   Mit Zitat antworten
Alt 04-01-2012, 17:22   #3 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
und nicht mehrmals das selbe rechnen lassen

Code:
var ec = ergebnisXML.children();
var anz = ec.length();
for(var i:int=0; i<anz; i++){ // da geht z.b. auch 'for each'
  var eci = ec[i];
  produkt = {};
  produkt.id = eci.id.toString(); // toString() ? sollte das nicht value() sein?
  produkt.produkt = eci.produkt.toString();
  produkt.bearbeiter = eci.bearbeiter.toString();
  produkt.datum = eci.datum.toString();
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (04-01-2012 um 17:30 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 04-01-2012, 17:26   #4 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 1.197
Achtung: Code ist direkt ins Forum getippt, komplett ungetestet

PHP-Code:
package {

    public class 
Product {
        
        private var 
xml XMLList;

        public function 
Product(xml:XMLList){
            
this.xml xml;
        }

        public function 
get id():String{    return xml.id.toString();    }
        public function 
get produkt():String{    return xml.produkt.toString();    }
//usw.

    
}

}

var 
products : Array = new Array();
var 
children XMLList ergebnisXML.children();
for(var 
i:int=0i<ergebnisXML.children().length(); i++){   
    
products.push(new Product(children[i]));

Variablen einmal außerhalb der Schleife (statt 1500 mal eine neue) deklarieren spart auch Performance
__________________
EDV = Ende Der Vernunft
hmpf ist offline   Mit Zitat antworten
Alt 04-01-2012, 17:38   #5 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Ich würde die Schleife eher so schreiben (und ggf. für produkt eine eigene Klasse definieren)*:
ActionScript:
  1. var produkt:Object;
  2. for each (var node:XML in ergebnisXML.children()) {
  3.     produkt = {
  4.         id: node.id.toString(),
  5.         produkt: node.produkt.toString(),
  6.         bearbeiter: node.bearbeiter.toString(),
  7.         datum: node.datum.toString()
  8.     };
  9. }
Generel muss ich aber shin10 recht geben. Es macht IMHO überhaupt keinen Sinn (und ist zudem unter Datenschutzgesichtspunkten ziemlich problematisch) gleich die komplette Datenbank (nichts anderes sind doch diese 1500 Einträge oder?) an den Client zu übertragen.

Es ist ja grade Sinn und Zweck einer Datenbank, dass man mit ihr schnell und sicher, serverseitig große Datenbestände durchsuchen kann und dann nur noch die Daten an die Ausgabe (in diesem Fall der Flash-Client) überträgt, die dieser auch wirklich benötigt.

Deine Datenstruktur sieht auch nicht so aus, als würden da mehr als ein dutzend Einträge gleichzeitig angezeigt?!

Edit: *hmpf war da schneller
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (04-01-2012 um 17:39 Uhr)
Martin Kraft ist offline   Mit Zitat antworten
Alt 04-01-2012, 18:02   #6 (permalink)
Neuer User
 
Registriert seit: Sep 2006
Beiträge: 620
Danke erstmal für eure Antworten! Ich werde mich morgen damit beschäftigen und versuchen eure Tipps umzusetzen.

Zu der Datenmenge: doch, ich benötige die Daten. Ich habe eine "Suche" die "rückwärts" läuft und so nur Treffer ausgibt. D.h., dass der Anwender eine ComboBox mit vorhandenen Werten zu einer Eigenschaft hat und anhand seiner Auswahl werden wiederum andere Auswahlmöglichkeiten beschränkt.
Geht man z.B. von den allgemeinen Daten aus kann der Anwender nach einer Kundennummer suchen und die Auswahl der Produkte reduziert sich auf die Produkte, die dem Kunden zugewiesen sind. So reduziert sich die Trefferanzahl mit jedem Filtersetzen.
Das Ganze ist allerdings sehr komplex, sodass ich die entsprechenden Daten nicht erst bei Bedarf laden kann (ich weiß ja nicht was der Anwender auswählen möchte).
Das mit der Datensicherheit stellt für mich kein Problem dar da das Ganze nur im Firmennetzwerk läuft.

Ich melde mich dann nochmal wie ich mit euren Tipps zurecht komme

Einen schönen Abend noch!
MfG Monk
__________________
Flash CS5 / Flex 3 / Flashdevelop / FB 4.6
dr monk ist gerade online   Mit Zitat antworten
Alt 04-01-2012, 18:16   #7 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Zitat:
Zitat von dr monk Beitrag anzeigen
Zu der Datenmenge: doch, ich benötige die Daten. Ich habe eine "Suche" die "rückwärts" läuft und so nur Treffer ausgibt. D.h., dass der Anwender eine ComboBox mit vorhandenen Werten zu einer Eigenschaft hat und anhand seiner Auswahl werden wiederum andere Auswahlmöglichkeiten beschränkt.

[...]

Das Ganze ist allerdings sehr komplex, sodass ich die entsprechenden Daten nicht erst bei Bedarf laden kann (ich weiß ja nicht was der Anwender auswählen möchte).
Wieso? Lad' sie doch einfach in dem Moment, wo der Nutzer etwas neues auswählt. Ich sehe da kein Problem. Jede Suchmachine und jeder Online-Shop bezieht die Daten beim Filtern und Sortieren neu vom Server....

(Das ist jetzt nicht wirklich schön) aber sieh Dir z.B. mal geizhals.at an. Da hast Du relativ komplexe Filtermöglichkeiten, die entsprechende der Vorauswahl ausgedünnt werden. Und das ganze funktioniert rein serverseitig auch ohne JS.
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!
Martin Kraft ist offline   Mit Zitat antworten
Alt 04-01-2012, 18:35   #8 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Wenn jedoch unbedingt bei dieser wir-schaufeln-alles-auf-den-Client-Lösung bleiben willst (wovon ich Dir abrate), solltest Du...

  • ...das Parsen und die Verarbeitung der XML-Inhalte so weit wie möglich verschlanken.
    Dazu könnte z.B. gehören...
    • Die einzelnen Nodes erst dann zu verarbeiten, wenn später auf sie zugegriffen wird.
    • JSON, CSV oder AMF statt XML einzusetzen.
      (Man müsste da einfach mal testen was am schnellsten verarbeitet werden kann).
    • Die Anzahl der Daten zu reduzieren und die Bezeichner zu kürzen.

  • ...die Daten asynchron zu verarbeiten.
    D.h. Du jagst nicht alles auf einmal durch eine Code-Schleifen und frierst so den Player ein, sondern arbeitest nach und nach (bei Event.ENTER_FRAME bzw. einem Intervall) verkraftbar große Portionen der Daten ab und zeigst dem Nutzer eine Art Loader an, der angiebt wie lange die Verarbeitung noch dauert.

    Vor kurzem habe ich in einem anderen Thread zu einem ähnlichen Problem mal einen Beispiel-Code für dieses asynchrone Vorgehen zusammengetippt.

    Adobe hat übrigens für eine der nächsten FlashPlayer-Versionen einen multithreadingfähigen XML-Parser angekündigt, mit dem man dann auch solch riesige XML-Dateien parsen kann, ohne den Rest der Anwendung einzufrieren.
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!
Martin Kraft ist offline   Mit Zitat antworten
Alt 04-01-2012, 18:44   #9 (permalink)
Neuer User
 
Registriert seit: Sep 2006
Beiträge: 620
Bei dem Projekt möchte ich gerne bei XML bleiben. Aber die Tipps haben mich auf eine neue Idee gebracht: Die XML ist ja sehr schnell (auch mit den großen Datenmengen) erstellt und ich gebe standardmäßig bei mehr als einem Ergebnis pro ComboBox ein "*" aus.
Ich werde morgen mal die Zuweisung ComboBox-abhängig machen. Dann werden die Daten erst zugewiesen wenn man ein CB auch auswählt.
Ich weiß nur noch nicht wie es dann mit der Filterfunktion (beschänkung der Auswahlmöglichkeiten) funktioniert. Aber das seh ich dann wenn ich es probiere

Danke nochmal für eure Mühe und tolle Hilfestellung. Irgendwann kann ich hoffentlich auch hier guten Support zurückgeben. Aber momentan ist alles noch "gefährliches Halbwissen aus tausend und einem Blog".

MfG Monk
__________________
Flash CS5 / Flex 3 / Flashdevelop / FB 4.6
dr monk ist gerade online   Mit Zitat antworten
Alt 04-01-2012, 19:07   #10 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.141
Ich würde AMF/Objekte nutzen. Das geht alles im Client ohne Probleme. Aber da wiederhole ich mich ja nur...
Omega Psi ist offline   Mit Zitat antworten
Alt 06-01-2012, 15:16   #11 (permalink)
Neuer User
 
Registriert seit: Sep 2006
Beiträge: 620
Hallo zusammen.

Ich habe jetzt das Produkt in eine Klasse ausgelagert nach der Vorlage von hmpf.
Allerdings musste ich mit einer XML statt einer XMLList arbeiten.
Mit der Verwendung der Klasse habe ich schon gute 4 Sekunden Ladezeit gespart (von ursprünglich ca 10 Sekunden).

Da ich die Daten nach dem Zuweisen noch filtere (doppelte Einträge lösche), ist dort noch ein großes Optimierungspotential.
Nächste Woche werde ich ran gehen und versuchen die Abläufe zu optimieren um eine möglichst gute Preformance raus zu bekommen.

MfG Monk
__________________
Flash CS5 / Flex 3 / Flashdevelop / FB 4.6
dr monk ist gerade online   Mit Zitat antworten
Alt 06-01-2012, 16:49   #12 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.141
Man braucht das XML nicht zu kapseln. Besser ist es direkt in Felder zu schreiben und dann das XML wegzuwerfen. Und du sparst keine Lade- sondern Rechenzeit.
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


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Problem bei Verarbeitung der XML Flasher81 ActionScript 2 4 19-03-2010 14:52
Neues Problem: Textarea und Verarbeitung Noir0x Server-Seite allgemein 4 26-04-2008 12:30
Preformance-Problem und load Movie kakktus Flash MX 2 11-03-2005 17:12
Preformance - Brauche Hilfe! sebezahn Flash MX 2004 4 25-09-2004 00:30
preformance: as-bewegungen vs. tweens mAtze_s Flash MX 3 10-01-2004 16:52


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:31 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele