Kategorie | Entwicklung Flex

Flex: Steigerung der Performance XML + DataGrid

am 27. Juli 2007 von Julien Lestelle

Frage aller coders Flex: Welches ist der schnellste Weg, um zu lesen, große Dateien von XML-Daten und zeigt sie in einem DataGrid? Die vier Methoden und ihre Leistung auf einer Maschine ... Quelle: http://philflash.inway .fr / dgperf / index.html

Methode 1 (klassisch) Knoten, XMLConnector mit Schaltplan und Databinding Methode 2 Attribute XMLConnector mit Abbildung und DataBinding Methode 3 Attribute parse XML und DataProvider Methode 4 Attribute und XML parse items
Flash Player 7 12 388 ms 11 963 ms 2 930 ms 442 ms
Flash Player 8 9 365 ms 7 569 ms 1 858 ms 314 ms

Das Problem detaillierten

In vielen Benutzer beschweren sich, dass die Leistung flex für die Wiedergabe von Dateien XML.Voici die Einstufung der 4 Methoden:

Methode 1

Um die Daten, verwenden wir Knoten. Ein Kunde wird auf folgende Weise: <client> <Name> <client><nom>Deschamps</nom><prenom>Amandine</prenom><ville>Caluire-Et-Cuire</ville><age>43</age><ca>2173.7</ca></client> </ <client><nom>Deschamps</nom><prenom>Amandine</prenom><ville>Caluire-Et-Cuire</ville><age>43</age><ca>2173.7</ca></client> <Vorname> <client><nom>Deschamps</nom><prenom>Amandine</prenom><ville>Caluire-Et-Cuire</ville><age>43</age><ca>2173.7</ca></client> </ <client><nom>Deschamps</nom><prenom>Amandine</prenom><ville>Caluire-Et-Cuire</ville><age>43</age><ca>2173.7</ca></client> <city> <client><nom>Deschamps</nom><prenom>Amandine</prenom><ville>Caluire-Et-Cuire</ville><age>43</age><ca>2173.7</ca></client> </ <client><nom>Deschamps</nom><prenom>Amandine</prenom><ville>Caluire-Et-Cuire</ville><age>43</age><ca>2173.7</ca></client> <age> <client><nom>Deschamps</nom><prenom>Amandine</prenom><ville>Caluire-Et-Cuire</ville><age>43</age><ca>2173.7</ca></client> </ <client><nom>Deschamps</nom><prenom>Amandine</prenom><ville>Caluire-Et-Cuire</ville><age>43</age><ca>2173.7</ca></client> > 2173.7 </ <client><nom>Deschamps</nom><prenom>Amandine</prenom><ville>Caluire-Et-Cuire</ville><age>43</age><ca>2173.7</ca></client> </ <client><nom>Deschamps</nom><prenom>Amandine</prenom><ville>Caluire-Et-Cuire</ville><age>43</age><ca>2173.7</ca></client> Für Flash verwenden wir ein XMLConnector um die Datei zu lesen (mit einem Schema), ein DataSet für die Vorlage und ein DataGrid, um die Daten. Verwendung von Daten-(DataBinding) zur Verknüpfung von 3 éléments.C ist die "klassische" finden Sie in vielen tutorials.

Warum ist diese Methode ist langsam?

Die XML-Datei hat eine Größe von 315 KB. Wenn das Schema eines XMLConnector, Flash verwendet einen XPath, um die Datei Datenverlust.Die Großhandel, XPath ist langsam: es ist die längste. Man kommt auf 12,5 Sekunden.

Methode 2

Die Idee dieser Methode ist die Verwendung von Attributen (anstelle von Knoten) und die Auswirkungen auf die Kunden performances.Un wird auf folgende Weise: <client nom="Deschamps" prenom="Amandine" ville="Caluire-Et-Cuire" age="43" ca="2173.7"/> = <client nom="Deschamps" prenom="Amandine" ville="Caluire-Et-Cuire" age="43" ca="2173.7"/> first_name = <client nom="Deschamps" prenom="Amandine" ville="Caluire-Et-Cuire" age="43" ca="2173.7"/> = <client nom="Deschamps" prenom="Amandine" ville="Caluire-Et-Cuire" age="43" ca="2173.7"/> = <client nom="Deschamps" prenom="Amandine" ville="Caluire-Et-Cuire" age="43" ca="2173.7"/> = "2173.7" /> Für Flash, verwenden wir die gleiche Methode wie bei der Methode 1: XMLConnector um die Datei zu lesen (wichtig in der Abbildung), wie ein DataSet Modell und ein DataGrid, um die Daten. Verwendung von Daten-(DataBinding) zur Verknüpfung der 3 Elemente.

Warum ist diese Methode schneller als die Methode 1?

Der XPath ist "schnell", um ein Attribut (für einen Knoten). Bemerkenswert auch, dass die XML-Datei ist "klein" (164 KB statt 315 KB). Die Dauer beträgt etwa 12 Sekunden ...

Methode 3

Um die Daten, verwenden wir attributs.L Idee dieser Methode ist nicht das Schema für XMLConnector (mit Hilfe eines XPath) aber parser manuell XML.Pour dies, so liest man "schnell" XML : Es wird eine while Schleife mit NextSibling. Zum Encodieren von Zahlen verwendet man Number (nicht parseFloat parseInt und die sind langsamer). Es ist nicht mehr databinding zwischen XMLConnector und Dataset. Man verwendet den DataProvider des DataSet, um das Ergebnis des XML-Parsing.

Warum ist diese Methode schneller als Methode 2?

Erfolgt manuell Parsen von XML. Es verwendet nicht mehr den XPath (und nicht dem Schema des XMLConnector). Hingegen "encoder"-Attribute. In der Mehrzahl der XML-Daten kann man von Strings und Zahlen. Die Kodierung ist also sehr schnell. Der Test dauert ca. 3 Sekunden.

Methode 4

Mit der Methode 3, man weiß sehr schnell lesen XML. Die Idee dieser Methode ist, ob man die Verbindung von Daten (DataProvider wird in der Methode 3). Wenn Sie in der Dokumentation des DataSet, gibt es zwei Methoden, um Daten in ein DataSet: die DataProvider und die Punkte. Was ist der Unterschied zwischen DataProvider und items? Die Dokumentation für Flash MX 2004, Flash 8 oder LiveDocs nicht zu viele Details. Man muss also schauen, die Quellen des DataSet: in Flash 8: Macromedia \ Flash 8 \ en \ First Run \ Classes \ mx \ data \ components \ DataSet. Asen ist die Methode DataProvider führt Typumwandlungen so gibt es ein Schema ( in der Methode internalAddItem). Elemente-Methode führt eine direkte Verbindung (ohne Konvertierung / Prüfung Typ). Wie man bereits solche Umwandlungen man also die Beiträge. (Bei Methode 3, die die Typkonvertierung nicht nötig). Der Code ist wie folgt:

client_con.addEventListener("result", Delegate.create(this, doParseData));//function doParseData():Void {var dataXML:XML = client_con.results;var resultArray:Array = [];var mainNode = dataXML.firstChild;var aNode:XMLNode = mainNode.firstChild;while (aNode) {var obj = new Object();for (var attribute:String in aNode.attributes) {if (attribute == “age” || attribute == “ca”) {obj[attribute] = Number(aNode.attributes[attribute]);} else {obj[attribute] = aNode.attributes[attribute];}}resultArray.push(obj);aNode = aNode.nextSibling;}// — use items (and not dataProvider)client_ds.items = resultArray;} client_con.addEventListener ( client_con.addEventListener("result", Delegate.create(this, doParseData));//function doParseData():Void {var dataXML:XML = client_con.results;var resultArray:Array = [];var mainNode = dataXML.firstChild;var aNode:XMLNode = mainNode.firstChild;while (aNode) {var obj = new Object();for (var attribute:String in aNode.attributes) {if (attribute == “age” || attribute == “ca”) {obj[attribute] = Number(aNode.attributes[attribute]);} else {obj[attribute] = aNode.attributes[attribute];}}resultArray.push(obj);aNode = aNode.nextSibling;}// — use items (and not dataProvider)client_ds.items = resultArray;} Delegate.create client_con.addEventListener("result", Delegate.create(this, doParseData));//function doParseData():Void {var dataXML:XML = client_con.results;var resultArray:Array = [];var mainNode = dataXML.firstChild;var aNode:XMLNode = mainNode.firstChild;while (aNode) {var obj = new Object();for (var attribute:String in aNode.attributes) {if (attribute == “age” || attribute == “ca”) {obj[attribute] = Number(aNode.attributes[attribute]);} else {obj[attribute] = aNode.attributes[attribute];}}resultArray.push(obj);aNode = aNode.nextSibling;}// — use items (and not dataProvider)client_ds.items = resultArray;} ));// client_con.addEventListener("result", Delegate.create(this, doParseData));//function doParseData():Void {var dataXML:XML = client_con.results;var resultArray:Array = [];var mainNode = dataXML.firstChild;var aNode:XMLNode = mainNode.firstChild;while (aNode) {var obj = new Object();for (var attribute:String in aNode.attributes) {if (attribute == “age” || attribute == “ca”) {obj[attribute] = Number(aNode.attributes[attribute]);} else {obj[attribute] = aNode.attributes[attribute];}}resultArray.push(obj);aNode = aNode.nextSibling;}// — use items (and not dataProvider)client_ds.items = resultArray;} (): client_con.addEventListener("result", Delegate.create(this, doParseData));//function doParseData():Void {var dataXML:XML = client_con.results;var resultArray:Array = [];var mainNode = dataXML.firstChild;var aNode:XMLNode = mainNode.firstChild;while (aNode) {var obj = new Object();for (var attribute:String in aNode.attributes) {if (attribute == “age” || attribute == “ca”) {obj[attribute] = Number(aNode.attributes[attribute]);} else {obj[attribute] = aNode.attributes[attribute];}}resultArray.push(obj);aNode = aNode.nextSibling;}// — use items (and not dataProvider)client_ds.items = resultArray;} = client_con.results; client_con.addEventListener("result", Delegate.create(this, doParseData));//function doParseData():Void {var dataXML:XML = client_con.results;var resultArray:Array = [];var mainNode = dataXML.firstChild;var aNode:XMLNode = mainNode.firstChild;while (aNode) {var obj = new Object();for (var attribute:String in aNode.attributes) {if (attribute == “age” || attribute == “ca”) {obj[attribute] = Number(aNode.attributes[attribute]);} else {obj[attribute] = aNode.attributes[attribute];}}resultArray.push(obj);aNode = aNode.nextSibling;}// — use items (and not dataProvider)client_ds.items = resultArray;} = []; client_con.addEventListener("result", Delegate.create(this, doParseData));//function doParseData():Void {var dataXML:XML = client_con.results;var resultArray:Array = [];var mainNode = dataXML.firstChild;var aNode:XMLNode = mainNode.firstChild;while (aNode) {var obj = new Object();for (var attribute:String in aNode.attributes) {if (attribute == “age” || attribute == “ca”) {obj[attribute] = Number(aNode.attributes[attribute]);} else {obj[attribute] = aNode.attributes[attribute];}}resultArray.push(obj);aNode = aNode.nextSibling;}// — use items (and not dataProvider)client_ds.items = resultArray;} = dataXML.firstChild ; client_con.addEventListener("result", Delegate.create(this, doParseData));//function doParseData():Void {var dataXML:XML = client_con.results;var resultArray:Array = [];var mainNode = dataXML.firstChild;var aNode:XMLNode = mainNode.firstChild;while (aNode) {var obj = new Object();for (var attribute:String in aNode.attributes) {if (attribute == “age” || attribute == “ca”) {obj[attribute] = Number(aNode.attributes[attribute]);} else {obj[attribute] = aNode.attributes[attribute];}}resultArray.push(obj);aNode = aNode.nextSibling;}// — use items (and not dataProvider)client_ds.items = resultArray;} = mainNode.firstChild; client_con.addEventListener("result", Delegate.create(this, doParseData));//function doParseData():Void {var dataXML:XML = client_con.results;var resultArray:Array = [];var mainNode = dataXML.firstChild;var aNode:XMLNode = mainNode.firstChild;while (aNode) {var obj = new Object();for (var attribute:String in aNode.attributes) {if (attribute == “age” || attribute == “ca”) {obj[attribute] = Number(aNode.attributes[attribute]);} else {obj[attribute] = aNode.attributes[attribute];}}resultArray.push(obj);aNode = aNode.nextSibling;}// — use items (and not dataProvider)client_ds.items = resultArray;} = client_con.addEventListener("result", Delegate.create(this, doParseData));//function doParseData():Void {var dataXML:XML = client_con.results;var resultArray:Array = [];var mainNode = dataXML.firstChild;var aNode:XMLNode = mainNode.firstChild;while (aNode) {var obj = new Object();for (var attribute:String in aNode.attributes) {if (attribute == “age” || attribute == “ca”) {obj[attribute] = Number(aNode.attributes[attribute]);} else {obj[attribute] = aNode.attributes[attribute];}}resultArray.push(obj);aNode = aNode.nextSibling;}// — use items (and not dataProvider)client_ds.items = resultArray;} (); client_con.addEventListener("result", Delegate.create(this, doParseData));//function doParseData():Void {var dataXML:XML = client_con.results;var resultArray:Array = [];var mainNode = dataXML.firstChild;var aNode:XMLNode = mainNode.firstChild;while (aNode) {var obj = new Object();for (var attribute:String in aNode.attributes) {if (attribute == “age” || attribute == “ca”) {obj[attribute] = Number(aNode.attributes[attribute]);} else {obj[attribute] = aNode.attributes[attribute];}}resultArray.push(obj);aNode = aNode.nextSibling;}// — use items (and not dataProvider)client_ds.items = resultArray;} aNode.attributes) client_con.addEventListener("result", Delegate.create(this, doParseData));//function doParseData():Void {var dataXML:XML = client_con.results;var resultArray:Array = [];var mainNode = dataXML.firstChild;var aNode:XMLNode = mainNode.firstChild;while (aNode) {var obj = new Object();for (var attribute:String in aNode.attributes) {if (attribute == “age” || attribute == “ca”) {obj[attribute] = Number(aNode.attributes[attribute]);} else {obj[attribute] = aNode.attributes[attribute];}}resultArray.push(obj);aNode = aNode.nextSibling;}// — use items (and not dataProvider)client_ds.items = resultArray;} == client_con.addEventListener("result", Delegate.create(this, doParseData));//function doParseData():Void {var dataXML:XML = client_con.results;var resultArray:Array = [];var mainNode = dataXML.firstChild;var aNode:XMLNode = mainNode.firstChild;while (aNode) {var obj = new Object();for (var attribute:String in aNode.attributes) {if (attribute == “age” || attribute == “ca”) {obj[attribute] = Number(aNode.attributes[attribute]);} else {obj[attribute] = aNode.attributes[attribute];}}resultArray.push(obj);aNode = aNode.nextSibling;}// — use items (and not dataProvider)client_ds.items = resultArray;} | | client_con.addEventListener("result", Delegate.create(this, doParseData));//function doParseData():Void {var dataXML:XML = client_con.results;var resultArray:Array = [];var mainNode = dataXML.firstChild;var aNode:XMLNode = mainNode.firstChild;while (aNode) {var obj = new Object();for (var attribute:String in aNode.attributes) {if (attribute == “age” || attribute == “ca”) {obj[attribute] = Number(aNode.attributes[attribute]);} else {obj[attribute] = aNode.attributes[attribute];}}resultArray.push(obj);aNode = aNode.nextSibling;}// — use items (and not dataProvider)client_ds.items = resultArray;} == client_con.addEventListener("result", Delegate.create(this, doParseData));//function doParseData():Void {var dataXML:XML = client_con.results;var resultArray:Array = [];var mainNode = dataXML.firstChild;var aNode:XMLNode = mainNode.firstChild;while (aNode) {var obj = new Object();for (var attribute:String in aNode.attributes) {if (attribute == “age” || attribute == “ca”) {obj[attribute] = Number(aNode.attributes[attribute]);} else {obj[attribute] = aNode.attributes[attribute];}}resultArray.push(obj);aNode = aNode.nextSibling;}// — use items (and not dataProvider)client_ds.items = resultArray;} ") client_con.addEventListener("result", Delegate.create(this, doParseData));//function doParseData():Void {var dataXML:XML = client_con.results;var resultArray:Array = [];var mainNode = dataXML.firstChild;var aNode:XMLNode = mainNode.firstChild;while (aNode) {var obj = new Object();for (var attribute:String in aNode.attributes) {if (attribute == “age” || attribute == “ca”) {obj[attribute] = Number(aNode.attributes[attribute]);} else {obj[attribute] = aNode.attributes[attribute];}}resultArray.push(obj);aNode = aNode.nextSibling;}// — use items (and not dataProvider)client_ds.items = resultArray;} = client_con.addEventListener("result", Delegate.create(this, doParseData));//function doParseData():Void {var dataXML:XML = client_con.results;var resultArray:Array = [];var mainNode = dataXML.firstChild;var aNode:XMLNode = mainNode.firstChild;while (aNode) {var obj = new Object();for (var attribute:String in aNode.attributes) {if (attribute == “age” || attribute == “ca”) {obj[attribute] = Number(aNode.attributes[attribute]);} else {obj[attribute] = aNode.attributes[attribute];}}resultArray.push(obj);aNode = aNode.nextSibling;}// — use items (and not dataProvider)client_ds.items = resultArray;} (aNode.attributes client_con.addEventListener("result", Delegate.create(this, doParseData));//function doParseData():Void {var dataXML:XML = client_con.results;var resultArray:Array = [];var mainNode = dataXML.firstChild;var aNode:XMLNode = mainNode.firstChild;while (aNode) {var obj = new Object();for (var attribute:String in aNode.attributes) {if (attribute == “age” || attribute == “ca”) {obj[attribute] = Number(aNode.attributes[attribute]);} else {obj[attribute] = aNode.attributes[attribute];}}resultArray.push(obj);aNode = aNode.nextSibling;}// — use items (and not dataProvider)client_ds.items = resultArray;} = aNode.attributes client_con.addEventListener("result", Delegate.create(this, doParseData));//function doParseData():Void {var dataXML:XML = client_con.results;var resultArray:Array = [];var mainNode = dataXML.firstChild;var aNode:XMLNode = mainNode.firstChild;while (aNode) {var obj = new Object();for (var attribute:String in aNode.attributes) {if (attribute == “age” || attribute == “ca”) {obj[attribute] = Number(aNode.attributes[attribute]);} else {obj[attribute] = aNode.attributes[attribute];}}resultArray.push(obj);aNode = aNode.nextSibling;}// — use items (and not dataProvider)client_ds.items = resultArray;} resultArray.push client_con.addEventListener("result", Delegate.create(this, doParseData));//function doParseData():Void {var dataXML:XML = client_con.results;var resultArray:Array = [];var mainNode = dataXML.firstChild;var aNode:XMLNode = mainNode.firstChild;while (aNode) {var obj = new Object();for (var attribute:String in aNode.attributes) {if (attribute == “age” || attribute == “ca”) {obj[attribute] = Number(aNode.attributes[attribute]);} else {obj[attribute] = aNode.attributes[attribute];}}resultArray.push(obj);aNode = aNode.nextSibling;}// — use items (and not dataProvider)client_ds.items = resultArray;} = aNode.nextSibling;) / - client_con.addEventListener("result", Delegate.create(this, doParseData));//function doParseData():Void {var dataXML:XML = client_con.results;var resultArray:Array = [];var mainNode = dataXML.firstChild;var aNode:XMLNode = mainNode.firstChild;while (aNode) {var obj = new Object();for (var attribute:String in aNode.attributes) {if (attribute == “age” || attribute == “ca”) {obj[attribute] = Number(aNode.attributes[attribute]);} else {obj[attribute] = aNode.attributes[attribute];}}resultArray.push(obj);aNode = aNode.nextSibling;}// — use items (and not dataProvider)client_ds.items = resultArray;} client_ds.items = client_con.addEventListener("result", Delegate.create(this, doParseData));//function doParseData():Void {var dataXML:XML = client_con.results;var resultArray:Array = [];var mainNode = dataXML.firstChild;var aNode:XMLNode = mainNode.firstChild;while (aNode) {var obj = new Object();for (var attribute:String in aNode.attributes) {if (attribute == “age” || attribute == “ca”) {obj[attribute] = Number(aNode.attributes[attribute]);} else {obj[attribute] = aNode.attributes[attribute];}}resultArray.push(obj);aNode = aNode.nextSibling;}// — use items (and not dataProvider)client_ds.items = resultArray;}

Hier ist eine Möglichkeit, von 12,5 Sekunden auf weniger als 0,5 Sekunden, um eine Datei von 2 000 Aufnahmen!

Wenn Sie zum ersten Mal auf Flex-Info.fr, können Sie sich den RSS-Feed. Danke für Ihren Besuch!

1 étoile2 étoiles3 étoiles4 étoiles5 étoiles (No Ratings Yet)
Loading ... Loading ...

1 Kommentare zu diesem Artikel

  1. momowell Says:

    Hallo
    Ich sehe, dass es eine gute Methode, aber Sie würde die Einrichtung in einem Projekt flex. Ich es nicht!

Kommentar schreiben

Subscriptions

  • Add to My AOL
  • Add to Google
  • Add to Zune
  • Add to Netvibes
  • Add to Technorati
  • Add to My Yahoo
  • Add to Zune

Umfrage

Wie finden Sie das neue Flex-info.fr?

View Results

Loading ... Loading ...

Mugsho