2013-08-13 5 views
16

Ho cercato di creare un oggetto Ember utilizzandoPerché un tizzone oggetto vuoto hanno una tale dimensione trattenuta di ~ 500

c = Em.Object.create(); 

e controllato il dump della memoria per vedere questo

enter image description here

Suggerisce una memoria superficiale di 24 e memoria contenuta di 524. La mia domanda è, è qualcosa di cui preoccuparsi in termini di memoria se tengo circa 500 oggetti di questo tipo in un controller.

Cerchiamo quindi di dire che ho un controller con 500 Ember oggetti nella matrice content, poi la discarica momory assomiglia a questo:

enter image description here

Qui ogni elemento dell'array ha 524 formato mantenuto, e la il controller ha una grande dimensione mantenuta di 268088 come risultato. E 'veramente un problema?

Dubito che tutti gli oggetti di tipo Ember si riferiscano agli stessi 524 byte di un oggetto comune riferito da ognuno di essi.

+1

Quando gli sviluppatori di emberjs hanno fatto un buon lavoro, tutti gli oggetti condividono gli stessi metodi (creati tramite l'attributo prototype), quindi almeno ci sono solo i metodi oggetto per tutti gli oggetti, non per ognuno di essi. La definizione dei metodi con l'attributo prototipo è sempre consigliata in termini di consumo di memoria. Tuttavia ogni oggetto ha i propri valori come ad esempio il nome o l'id che consuma anche la memoria per ogni oggetto. – Blauharley

risposta

33

Ok ho finalmente dato un'occhiata alla sorgente di Ember e l'ho capito. È perché they are using delete.

(Ember has fixed this now e non ci dovrebbe essere tale utilizzo della memoria drastica dagli oggetti tempora vuoti più.)

delete dice V8 che "userò questo oggetto come una mappa di hash piuttosto che oggetto reale" e quindi passa a una struttura di mappa hash interna per memorizzare le proprietà in piuttosto che un costrutto simile a "C struct" che è una caratteristica fondamentale nelle fondamenta sulle quali è costruita la moderna prestazione javascript.

Quando si guarda il grigio properties, significa lo spazio occupato dalla memoria interna che è una tabella hash e occupa quindi molto spazio.

Ho creato un jsfiddle:

http://jsfiddle.net/JSbMJ/

È necessario eseguire uno snapshot mucchio e cercare gli oggetti e vedere come enormemente le loro dimensioni variano (472 vs 80):

enter image description here

enter image description here

Non è assolutamente un problema però perché devi solo fare CRUD con ember, non giochi, simulazioni fisiche o simili.

Btw, non so se altri motori hanno una tale reazione su delete ma immagino lo farebbero perché un'operazione del genere non ha senso quando si ha un oggetto semanticamente ed è impossibile in molte lingue.

+0

Grazie per la risposta, hai detto che dovrei fare solo CURD con Ember. Ma se ho una collezione di 1000 oggetti memorizzati in webSQL, preferisco tenerli in un controller in modo da non dover fare dbrequests ogni volta per il recupero. Anche io lo sto facendo in ios usando cordova che mi fa pensare in termini di prestazioni. Hai qualche suggerimento per questo scenario? Inoltre, in che modo la tua risposta si riferisce all'altra risposta, suggerendo che si tratta di dimensioni di riferimenti raccolti durante GC? – sabithpocker

+1

@sabithpocker 1000 per tutta la durata dell'applicazione non è tanto anche se prendono 0.5kb ciascuno. Questa roba è importante quando crei qualcosa come ad es. 60000 oggetti al secondo (un effetto di esplosione di particelle in un gioco, ad esempio, più oggetti, più freddo sarà: P). Sì, se un oggetto ember vuoto ottiene GCd, ottieni 524 byte. – Esailija

+0

Questo è un comportamento estremamente interessante. Hai qualche riferimento per questo, o sono solo caratteristiche non documentate (o scarsamente così) nel codice sorgente V8? –

2

La dimensione mantenuta è la memoria che verrà rilasciata nel momento in cui GC raccoglie l'oggetto.

Nel tuo caso l'oggetto Ember stesso utilizza 24 byte ma possiede anche altri oggetti in memoria e la dimensione totale di questi oggetti è 524. Quando rimuovi tutti i riferimenti a un oggetto Ember particolare, diventa un cestino e con tutti gli oggetti dipendenti che possiede esclusivamente verranno raccolti al prossimo GC.

Se il controller è l'unico proprietario dei 500 oggetti Ember, le dimensioni conservate di questi oggetti verranno aggiunte alle dimensioni mantenute del controller.

There is a good video about memory on youtube.