Comunidad de diseño web y desarrollo en internet online

rendimiento Array.length

Citar            
MensajeEscrito el 22 Ene 2009 05:31 am
Hola flashers.

Tengo una duda que quiero resolver de una vez por todas, ¿ Array.length gasta muchos recursos como dicen algunos ?

yo antes hacia mis for asi

Código ActionScript :

for(var i:Number = 0; i < array_arr.length; i++ )
pero desde que lei que usar asi length gastaba muchos recursos, entonces hago mis for asi

Código ActionScript :

for(var i:Number = 0; array_arr[i] != undefined; i++ )
o intento usar

Código ActionScript :

for(var i in arrar_arr)
en muchos casos me he topado con que tengo que usar le length dentro del for, y lo hago de este modo

Código ActionScript :

for(var i:Number = 0, l:Number = array_arr.length; i < l; i++ )
pero ultimamente me encontre con muchos casos en los que uso varios array y length, itero muchas veces y en todas esas veces me da un sensacion de estar desperdiciando muchos recursos, hoy pense que talvez eso eran patrañas o no era muy significativo el gasto de recursos, como para sacrificar la "simplesa" de mi codigo, ademas en la ayuda de flash, dice que la clase Array actualiza length cuando se agrega o se retira un item, por tanto, length no deberia gastar mas recursos que la llamada a cualquier variable, alguien ha realizado test o algo sobre este caso?, alguien sabe que tipo de scripts gastan mas recursos? gracias por sus respuestas..

Por LongeVie

Claber

1741 de clabLevel

1 tutorial

Genero:Masculino  

En un lugar, re moto.

firefox
Citar            
MensajeEscrito el 22 Ene 2009 09:56 am
Lo más rápido es utilizar

Código :

for each(var item:Number in matriz){

Pero vamos, estamos hablando de que para una matriz con 1 millón de números, for each tarda 47ms, y con un "for de toda la vida" 250ms. Es decir, for each es 5 veces más rápido, pero en una matríz con 100 elementos no vas a notar nada.

Por esedeerre

132 de clabLevel



 

MadRid

opera
Citar            
MensajeEscrito el 22 Ene 2009 10:06 am
Bueno, for each es la nueva sentencia de AS3 pero como yo soy de esos amargados que pinchan los balones que se vuelan a mi casa, solo uso AS2, pero en si concuerdo con tigo, en matriz de 100 elementos no se ve la diferencia, y si, yo no uso matrices de mas de 100 elementos, hasta de menos de 30 elementos, con la casualidad de que en los proyectos me topo con los intervalos y el onEnterFrame, ahi es en donde noto si mi loop hace buen uso de los recursos, mas a ahora que estamos en crisis, pero, dime SDR, que herramienta usaste para conseguir esos tiempos, puede que haga tambien unos test. Gracias.

Por LongeVie

Claber

1741 de clabLevel

1 tutorial

Genero:Masculino  

En un lugar, re moto.

firefox
Citar            
MensajeEscrito el 22 Ene 2009 10:15 am
simplemente pillo el tiempo en ms antes de recorrer el bucle, y miro cual es después.

Con el objeto Date, vamos.

Por esedeerre

132 de clabLevel



 

MadRid

opera
Citar            
MensajeEscrito el 22 Ene 2009 10:23 am
XD bueno, si, tienes razon, no se porque tenia el pensamiento de que habias usado una herramienta :P, bueno, entonces formulo las preguntas mas concretas para algun leector de este post, ¿Conoces de mejores practicas en el codigo que mejoren el rendimiento? ¿Array.length de AS2, deteriora la velocidad de reproduccion de una aplicacion si se usa irresponsablemente?

Por LongeVie

Claber

1741 de clabLevel

1 tutorial

Genero:Masculino  

En un lugar, re moto.

firefox
Citar            
MensajeEscrito el 22 Ene 2009 10:29 am
Aquí tienes varios enlaces:

http://www.gotoandplay.it/_forums/viewtopic.php?t=179

Por esedeerre

132 de clabLevel



 

MadRid

opera
Citar            
MensajeEscrito el 22 Ene 2009 11:34 am
Perfecto, bueno con el link que ha puesto SDR, me han surgido alguna dudas, :P(uno que otro link estaba roto, pero me basare en el de gotoandplay.it), aqui expongo una lista de lo mas destacable que lei:


    Poner un movieClip _visible = false, no libera los recursos como pensaba, segun el documento, es mejor tener un frame vacio y hacer un gotoAndStop a ese frame, bueno ahi tengo unos problemas, una vez con un script un tanto pesado, el player se me ponia lento, pero cuando ponia el _visible a false a ese clip, todo se agilizaba, bueno sera por las versiones de los player, o algo asi, ¿Alguien sabe algo de eso?

    Usar codigos de este tipo es mejor, como pueden apreciar usa apuntadores a funciones, lo que agiliza la ejecucion dentro de la iteracion del ciclo, dado que el nombre de la funcion se resuleve una sola vez y no varias. :o

    Código ActionScript :

    var floor = Math.floor
    var ceil  = Math.ceil
    for (var i=0; i < MAX; i++)
    {
       num = floor(MAX) - ceil(MAX)
    }
    


    No hay que declarar variables dentro de los ciclos, for(...){ var algo = valor; }

    No usar condicionales de este tipo if (a == 1 && b == 2 && c == 3 && d == 4) mejor usar if anidados :D

    En el documento habla sobre "tellTarget", bueno esa funcion es como un "with" pero unicamente para MC, dice que usar esa funcion da mejor renidmiento que usar el operador punto(.), mmm, aun asi no hay nada que diga que tellTarget esta desfazado, pero eso si, es bastante viejito ese documento, dice que incluso dentro de la declaracion de clases, podemos usar el bloque "whit(this)" no se que tanto mejor rendimiento le de eso, pero aqui yo no sacrificaria la usabilidad de mi codigo con tellTarget o with.

    Habla de usar la clase ASBroadcaster cuando se quiere ejecutar la misma funcion en varios objetos/listeners simultaneamente, mmm, supongo que debe ser igual con el EventDispatcher :D


Bueno, no decian nada sobre length, y hablaban casi todo el tiempo de loop, eso me hace pensar que eso de que length decrementa el rendimiento, es un mito urbano.

Por LongeVie

Claber

1741 de clabLevel

1 tutorial

Genero:Masculino  

En un lugar, re moto.

firefox
Citar            
MensajeEscrito el 26 Ene 2009 10:02 am
Buenas, he hecho un pequeño artículo sobre las optimizaciones:

Optimizaciones en AS3

Espero que os ayude.

Por esedeerre

132 de clabLevel



 

MadRid

opera
Citar            
MensajeEscrito el 26 Ene 2009 10:15 am
:o Me he quedado pasmado cuando veo los resultados de length, ese incremento notable, a que crees que se deba? a que como dicen, length involucra hacer calculos con la matriz, o es porque se tiene que leer el nombre length 1000000 de veces?

Por LongeVie

Claber

1741 de clabLevel

1 tutorial

Genero:Masculino  

En un lugar, re moto.

firefox
Citar            
MensajeEscrito el 26 Ene 2009 10:27 am
Claro, con length tiene que estar comprobando el valor de length en cada iteración, lo que causa en retraso.

Para Flash es más rápido averiguar cuanto vale una variable, que averiguar el tamaño de una matriz. Como ponia en una de las primeras respuestas, no creo que esto se note mucho en una matriz de 100 elementos, pero son buenas prácticas que no cuesta nada acostrumbrarse a hacer, y que unidas pueden hacer que nuestra aplicación vaya un poco más rápido.

Por esedeerre

132 de clabLevel



 

MadRid

opera
Citar            
MensajeEscrito el 26 Ene 2009 10:59 am
:P osea, length calcula el valor de una matriz, o solo trae el valor de la memoria?

Por LongeVie

Claber

1741 de clabLevel

1 tutorial

Genero:Masculino  

En un lugar, re moto.

firefox
Citar            
MensajeEscrito el 26 Ene 2009 05:13 pm
length calcula la longitud de una matriz. Ten en cuenta que ese valor puede variar en cada iteración, por lo que flash lo recalcula en "cada vuelta".

Si lo haces con una variable i <= l, solo tiene que comprobar el valor de una variable, que es más rápido.

Por esedeerre

132 de clabLevel



 

MadRid

opera

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.