2012-02-06 8 views
7


Sto sviluppando un componente aggiuntivo di firefox utilizzando XUL e voglio misurare e profilare l'utilizzo della mia memoria di estensione.
Come posso fare questo? e controlla quale funzione sta utilizzando la maggior parte dell'uso della memoria e quanta parte dell'uso della memoria si aggiunge a firefox?

Come misurare l'utilizzo della memoria add-on firefox

+0

non sono sicuro che ti possa aiutare ... ma puoi digitare "about: memory" nella barra degli indirizzi, ma non penso che diventerà così dettagliato come speri. –

+0

il about: la memoria non è affatto utile, per capire qualcosa in là ho bisogno di imparare come funziona l'uso della memoria di Firefox ... e questo è troppo. – Yosi

risposta

6

Non è possibile misurare l'impatto di una singola funzione, la gestione della memoria in Firefox non funziona a questo livello - funziona con i compartimenti. Se la tua estensione ha una propria finestra, potrai vedere il compartimento di questa finestra sotto about:memory?verbose (fai clic su "Riduci l'utilizzo della memoria", altrimenti potresti vedere gli oggetti che saranno comunque raccolti). Se il codice della tua estensione viene eseguito nel contesto della finestra del browser, di solito sei sfortunato: non sarai in grado di distinguerlo dagli altri script in esecuzione lì. Lo stesso vale per i componenti XPCOM e i moduli JavaScript: tutti vengono caricati nello scomparto "[System Principal]".

Cosa si può fare per separare gli script da un comparto grande: utilizzare le sandbox, una sandbox ottiene sempre il proprio comparto. Ad esempio, in una finestra del browser si farebbe qualcosa di simile:

Components.utils.import("resource://gre/modules/Services.jsm"); 
var mySandbox = Components.utils.Sandbox(window, 
        {sandboxName: "myExtension/browserScript.js"}); 
mySandbox.window = window; // Expose window variable to scripts in the sandbox 
Services.scriptloader.loadSubScript("chrome://myextension/content/browserScript.js", 
            mySandbox); 
mySandbox.init(); // Call function init() of the script in the sandbox 

Di conseguenza, un vano chiamato myExtension/browserScript.js verrà visualizzato sotto about:memory?verbose e sarete in grado di vedere la quantità di memoria questo script (insieme con gli oggetti crea ecc.) prende esattamente. Cose da tenere a mente:

  • Lo script nella sandbox non avrà accesso alle variabili da "esterno". Devi impostare esplicitamente queste variabili come proprietà della sandbox (come ho fatto con la variabile window nell'esempio).
  • Gli scompartimenti non sono economici e passare oggetti tra compartimenti non è economico. Quindi creare un compartimento per ogni funzione sarebbe una cattiva idea a causa dei costi generali coinvolti.

Documentazione: Sandbox, Services.jsm

Aggiornamento: A partire da Firefox 13 cose sono cambiate. Ad esempio, c'è this extension che ti mostrerà tutti gli oggetti attualmente in memoria. Ancora lontano dall'essere comodo, anche ottenere l'intera immagine non è banale, ma ti dà granularità su un livello al di sotto dei compartimenti.

+0

Grazie mille, il mio codice è in esecuzione in sandbox, tutto ciò di cui ho bisogno ora è solo per aggiungere i nomi alla mia sandbox e quindi posso profilarlo, grazie! – Yosi

+1

@Yosy: vedi l'aggiornamento alla mia risposta, ora puoi guardare l'intero grafico degli oggetti JavaScript. –

+0

Grazie Vladimir, grazie alla risposta originale ho ottimizzato l'utilizzo della memoria nella mia estensione, controllerò questa estensione :) – Yosi

Problemi correlati