2015-05-20 17 views
5

Ho una matrice dichiarata comepre-allocare memoria a matrice di oggetti

var arr = new Array(); 

allora ho un array di oggetti che sono restituiti dal server. E ogni oggetto in questo array ha tre campi (sempre). Devo scorrere questo e aggiungere all'array arr condizionalmente.

Poiché questo arr non è pre-assegnato, raggiunge le prestazioni per un numero elevato nell'array principale.

Esiste un modo per pre-allocare l'arrayarr con l'array di risposta principale in modo da evitare questo problema di prestazioni?

Come si ottiene la dimensione dell'oggetto?

Grazie.

+1

non ti preoccupare, sul serio, questo non è C, l'intero punto delle lingue di livello superiore non deve preoccuparsi di questa roba. Per il tuo problema di loop, basta richiamare il "filtro # array" sull'array restituito. –

+0

@TasosK. https://gamealchemist.wordpress.com/2013/05/01/lets-get-those-javascript-arrays-to-work-fast/ – aneeshere

risposta

7

Supponiamo di avere 10 oggetti e di passare tre valori da ciascun oggetto a un array. È possibile inizializzare l'array con lunghezza di 30 (10 * 3) passando l'intero 30 alla costruzione Array in quanto tale:

var numObjects = 10; 
var myArray = new Array(3*numObjects); 

Si prega di fare riferimento al mio punto di riferimento jsperf per una prova della prestazione maturata. In breve, il pre-dimensionamento del tuo array è ~ 25% più veloce in Firefox 38, ~ 81% più veloce in Chrome 42 e ~ 16% più veloce in Internet Explorer 11. I numeri variano a seconda dell'esperienza dell'utente che gestisce questi benchmark, ma il la tendenza rimarrà coerente. Le prestazioni ottimali deriveranno dal pre-dimensionamento degli array.
http://jsperf.com/array-growth-dynamic-vs-preset

Una discussione più approfondita di questo tema si è verificato qui sul SO
How to initialize an array's length in javascript?

+3

Puoi dimostrare con un benchmark che questo ha qualche effetto positivo? – max

+1

@papirtiger Sì, davvero. – ThisClark

+0

Mi correggo quindi. – max

2

Grazie qualunque divinità credere a (o non) che Javascript non ha alcun accesso diretto al allocazione di memoria. Sarebbe stato davvero orribile considerando la qualità di gran parte della JS che sporca l'interwebs.

Javascript da solo alloca memoria agli array durante la creazione e recupera la memoria quando viene raccolta. Il pre-riempimento di un array non avrà alcun effetto positivo sull'utilizzo o sulle prestazioni della memoria.

Modifica: Ho sbagliato. Vedi la risposta di @ ThisClark.

MDN ha un buon article on how memory management and GC work in javascript.

+0

Penso che il punto su cui voi e molti altri possano trascurare qui è il fatto che non è Javascript che ha "accesso diretto all'allocazione della memoria" come dici tu, ma piuttosto è il browser web che implementa la sua versione della lingua che ha accesso all'assegnazione della memoria. Inoltre, nel link che hai fornito, non c'è nulla che indichi che Javascript sia unico rispetto ad altri linguaggi su come viene gestita la gestione della memoria. Il punto che ho tolto dall'articolo è questo: Indipendentemente dal linguaggio di programmazione, il ciclo di vita della memoria è praticamente sempre lo stesso. – ThisClark

+0

Grazie per aver condiviso le tue conoscenze, ho imparato qualcosa di nuovo qui. Avevo torto sulla pre-assegnazione degli array e ho discusso con me stesso se dovessi rimuovere la mia risposta. Penso che potrebbe essere meglio mettere che il browser non fornisca ** l'accesso diretto all'assegnazione della memoria - non è un'omissione piuttosto una scelta progettuale consapevole. Continuo a rabbrividire nel pensare a quello che tutti i ninja jQuery là fuori tirerebbero fuori da lì era un 'malloc' nel browser. – max

1

È possibile filtrare la matrice utilizzando filter funzione come nell'esempio qui sotto

var result = [ 
    { 
     age: 15 
    }, 
    { 
     age: 21 
    }, 
    { 
     age: 25 
    } 
]; 

function isGreaterThan20(obj) { 
    return obj.age > 20; 
} 

var arr = result.filter(isGreaterThan20); 
// arr becomes [{ age: 21}, { age: 25}] 

Se è necessario pre-allocare un array con dimensioni definite, utilizzare new Array(size)

Problemi correlati