DataGrid Performance (o como leer 2 000 registros en menos de 0,5 segundos)
Thanks to Dan L. for the translation...
Traduire/Translate : French - English - Deutsch (by Google)
El problema
Pregunta : Cual es la forma más rápida de leer 2 000 registros para despues mostrarle en un datagrid?
Esto són cuatro metódos y los resultados sobre una maquina:
Método 1 (clásica) Nodos, XMLConnector con Estructura y DataBindings |
Método 2 Atributos, XMLConnector cón Estructura y DataBinding |
Método 3 Atributos, parseo del XML y dataProvider |
Método 4 Atributos, parseo del XML y 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 |
El caso detallado:
En los foros, los usuarios se quejan de las performancias del trio XMLConnector c/DataSet y c/DataGrid para leer documentos XML.
Este árticulo compara 4 métodos para leer un archivo XML de 2000 grabaciones.
La prueba :
El archivo esta constituido de 2000 nodos representando los clientes.
Un cliente es representado por nombre, vive en una ciudad, tiene una edad, y un numero de negocio (ca). Los datos son de tipo String y Number
L'objectif est de lire le plus rapidement possible les données stockées dans un fichier XML, de l'afficher dans un DataGrid et de se positionner à la 3ème ligne.
dgperfSrc.zip (1 696 Ko)
Método 1
Para mostrar los datos, usamos los nodos. Un cliente esta representado de la siguiente forma:
<client>
<nom>Deschamps</nom>
<prenom>Amandine</prenom>
<ville>Caluire-Et-Cuire</ville>
<age>43</age>
<ca>2173.7</ca>
</client>
En Flash, usamos el componente XMLConnector para parsear en archivo (guiandonos de su estructura), un DataSet como modelo y un DataGrid para mostrar los datos. Usamos los enlaces de datos entre los tres componentes (DataBinding)
Ese método más "clasico" que encontrará en los numerosos tutoriales.
Porque este método es lento?
El archivo XML pesa 315 Ko. Cuando usamos una estructura a traves de un XMLConnector, Flash usa XPath para acceder a los datos.
El archivo es bastante pesado, y el método XPath se hace muy lento: es el método mas largo. Llegamos a parsear un archivo en 12,5 segundos.
La prueba
Esperar 12,5 segundos (cón Flash Player 7)...
Método 2
La idea de este segundo método es de usar los atributos (en vez de nodos) y de observar las consecuencias sobre las performancias.
Un cliente esta representado de la siguiente forma:
<client nom="Deschamps" prenom="Amandine" ville="Caluire-Et-Cuire" age="43" ca="2173.7"/>
Para flash, usamos el mismo método que en primer ejemplo, o sea: ún XMLConnector para parsear el archivo(importando la estructura del XML), ún DataSet como modelo de los datos y un DataGrid para mostrar los datos. Usamos los enlaces de datos entre los tres componentes (DataBinding)
Porque este método es mas veloz que el primero?
El XPath acceda a los atributos de forma mucho más "veloz" (a la diferencia de un nodo). Notamos que el archivo XML es mas liviano (164 ko en vez de 315 ko)
La prueba
Esperar 12 segundos...
Método 3
Para mostrar los datos, usamos los atributos.
La idea de este método es de no grabar la estructura del archivo XML en el XMLConnector (que usaria XPath) pero de parsear manualmente el XML.
Para esto , leemos lo más "rapidamente" el XML : usamos una secuencia while cón nextSibling. Para encodificar los nombres, usamos Number (y no parseInt ó parseFloat quienes són más lentos).
No existe más databindings entre el XMLConnector y el Dataset. Usamos el dataProvider del mismo Dataset para enlazar el resultado del parseo del XML.
Porque este método es mas véloz que el método 2 ?
Hacemos manualmente el parseo del XML. No usamos más XPath (y no configuramos la estructura del XML en el componente XMLConnector).
Pero hay que "encodificar" los atributos. En la mayoría de los datos XML, encontramos cadenas de caracteres y de nombres. Asi, la encodificación es más eficiente.
La prueba
Esperar 3 segundos...
Método 4
Cón la metoda 3, sabemos leer muy rapidemente el XML. La idea es de conocer si se puede optimizar los enlaces de datos (usamos dataProvider en el método 3).
Si miramos la documentación del DataSet, existe dos métodos para asociar los datos a un DataSet : el método dataProvider et el método items.
Cual es la diferencia entre dataProvider y items ?
La documentación de Flash MX 2004, de Flash 8 o de los LiveDocs no dan muchos detalles. hay que mirar en los fuentes del DataSet :
En Flash 8 : Macromedia\Flash 8\en\First Run\Classes\mx\data\components\DataSet.as
En realidad, el método dataProvider realiza conversiones de tipo si existe una estructura (cón el método internalAddItem). El método items realiza un enlaze directo (sin conversión/aprobación del tipo).
Como hemos ya efectuado las conversiones del tipo, usamos entonces el método items. (En el método 3, la conversión de los tipos no era nécesaria).
El código es el siguiente:
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;
}
Esto es una forma que nos permite de optimizar nuestros procesos de 12,5 egundos a menos de 0,5 secondes para leer un archivo de 2000 registros..
La prueba
Esperar mas o menos 0,5 segundos...
Comentarios
Flash Player 7 / Flash Player 8
Las pruebas demuestran que pasar a Flash Player 8 aumenta las performancias de 40%.
Inconvénientes
La metoda 4 es entonces la más veloz.
Uno de los inconvenientes es de encodificar los atributos. En nuestro caso, existe dos tipos de atributos : String y Number : esto es el caso mayoritario.
Cuestión: Mi archivo XML posea los nodos y los atributos entonces no puedo usar ese método.
Existe una posibilidad que es de usar una conversión XLS (XLST) en el servidor para preparar el XML. De esta forma se convierte todos los datos en atributos.
dgperfSrc.zip (1 696 Ko)
Versión
versión 1.0 - 23 Octobre 2005 : versión iniciale