Intéréssant tout ça.

Ya un certain temps, j'avais essayé de voir à quoi ça pouvais servir.
Mais j'arrivais pas vraiment à savoir si c'était seulement l'instance
de classe ou l'empreinte total en mémoire de l'objet (comprendre :
l'instance + les valeurs de propriétés + autres objets liés)

Bon je m'auto répond :
http://hg.mozilla.org/tamarin-redux/file/0a7bf0e036b8/core/AvmPlusScriptableObject.h#l60
----
/**
 * Returns the number of bytes of memory taken by this object, that
are not
 * also shared by any other objects.  For example, a dependent String
would
 * include sizeof(String) but not the size of the buffer of the master
string;
 * but a dynamic String would include both sizeof(String) and the size
of
 * the buffer.
 *
 * Used by the profiler to tell the user the shallow size of the
object.
 */
virtual uint64_t bytesUsed() const = 0;
----
Quoi que ...

Au passage le lazy init est fait aussi sur des classes non "natives",
intégrées dans le playerglobal.abc à l'instar des classes commes
URLLoader et des fonctions setTimeout ou setInterval :
http://gist.github.com/326911
http://gist.github.com/243608

On Mar 12, 10:36 am, zwetan <[email protected]> wrote:
> dans un thread précédent je parle d'un petit utilitaire
> pour tracer la memoire utilisé par un object
>
> ----
> package
> {
>     import flash.sampler.getSize;
>     import flash.utils.getQualifiedClassName;
>     public var size:Function = function( o:* ):void
>     {
>         var n:String = getQualifiedClassName( o );
>         var s:Number = getSize( o );
>         var b:String = "byte";
>         if( s > 0 ){ b += "s" };
>         if( s == 4 )
>         {
>             n = "("+n+")";
>             s = 0;
>         }
>         trace( n + " = " + s + " "+b );
>     }}
>
> ----
>
> voici un peu plus d'explication
>
> http://hg.mozilla.org/tamarin-redux/file/0a7bf0e036b8/extensions/Samp...
> ----
> /**
> * Returns the size in memory of a specified object when used with the
> Flash Player 9.0.115.0 or later debugger version. If
> * used with a Flash Player that is not the debugger version, this
> method returns <code>0</code>.
> * @param o The object to analyze for memory usage.
> * @return The byte count of memory used by the specified object.
> * @includeExample examples\DeletedObjectSizeExample.as -noswf
> * @playerversion Flash 9.0.115.0
> * @langversion 3.0
> * @keyword getSize
> */
> [native("SamplerScript::getSize")]
> public native function getSize(o:*):Number;
> ----
>
> http://hg.mozilla.org/tamarin-redux/file/0a7bf0e036b8/extensions/Samp...
> ----
> static double _get_size(Atom a)
> {
>  #ifdef DEBUGGER
>                 switch(a&7)
>                 {
>                 case kDoubleType:
>                         return 8;
>                 case kObjectType:
>                 case kStringType:
>                 case kNamespaceType:
>                         AvmPlusScriptableObject *o = 
> (AvmPlusScriptableObject*)(a&~7);
>                         if(o)
>                                 return (double)o->bytesUsed();
>                 }
>                 return 4;
>   #else
>                 (void)a;
>                 return 0;
>   #endif
>  }
> ----
>
> donc cela ne marche que avec FP debug 9.0.115.0+ , sinon ca renvoit 0
> (zero)
>
> la partie un peu "obscure" c'est ce "return 4"
>
> en gros si vous avez un slot dans une class pour contenir une instance
>
> public var toto:MaClass;
>
> ce slot ne peut pas etre definit a zero
> donc au pire du pire il contiendra null
>
> toto:MaClass = null;
>
> et ca flash en interne lui assignera un poids de 4 bytes
>
> et dans le cas ou le slot contient une instance
>
> toto:MaClass = new MaClass();
>
> là flash ira chercher o->bytesUsed();
> et renverra le poids en mémoire utilisé par l'instance
>
> en soit la function size() est un peu pourri
> elle ne test que pour la valeur 4 et consider que le poids en memoire
> est 0 (zero)
> si le poids est 4 (cad le poids par defaut)
>
> mais bon pour tester si un object est bien nettoyé de la mémoire en
> fait c'est amha
> mieux de faire comme ca, on s'attends a ce que une instance occupe x
> bytes ou 0 byte,
> avoir un resultat de 4 bytes, on ne fait pas automatiquement la
> relation "ah oui mais c'est le poids occupé
> par la valuer null en mémoire".
>
> l'autre chose aussi c'est de comprendre que la VM Flash fait pas mal
> d'optimization et
> notamment du lazy init
>
> cad
> quand vous écrivez votre code AS3, vous pouvez utiliser toutes les
> classes dites "builtin"
> et que quand vous compilez, mxmlc va utiliser playerglobal.swc comme
> une librairie externe
> (cad il ne compile pas ce que contient playerglobal.swc dans le *.swf)
>
> donc si par exemple vous avez
> import flash.display.Bitmap;
> var b:Bitmap = new Bitmap( ... );
>
> votre *.swf final ne contient que un lien symbolique vers cette class
>
> mais en fait ca va meme plus loin
> playerglobal.swc contient bcp de definition de classes qui sont en
> fait des classes natives
> cad leur implementation est en C/C++ dans le flash player (pas en AS3
> comme vos propres classes)
>
> et que si par exemple vous avez
> import flash.display.Bitmap;
>
> var b:Bitmap;
>
> if( false )
> {
>     b = new Bitmap( ... );
>
> }
>
> et bien la class Bitmap ne sera pas initialisée par le flash player,
> meme si celui-ci contient sa definition en natif et meme si votre
> *.swf a un lien symbolique vers cette classe
>
> et c'est ca qui peut donner lieu a ce que j'avais appelé un "bump
> memoire"
> cad que tant que flash n'a pas vraiment besoin d'instancier la class
> Bitmap, et bah il ne le fait pas
>
> mais quand flash a besoin d'instancier cette class, si vous tester la
> memoire totale utilisé par le player
> vous verrez une variation de qlqs MB (genre pour Bitmap et BitmapData,
> ca rajoute ~7MB en memoire)
>
> donc oui le flash player fait du lazy init sur les classes natives,
> donc quand vous etes dans un cas ou vous testez pour des memory leak,
> ce genre de petite difference
> ca peut jouer sur vos resultats.
>
> zwetan

-- 
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes FCNG.
Pour envoyer un message à ce groupe, adressez un e-mail à [email protected].
Pour vous désabonner de ce groupe, envoyez un e-mail à l'adresse 
[email protected].
Pour plus d'options, consultez la page de ce groupe : 
http://groups.google.com/group/fcng?hl=fr

Répondre à