Utilizzo della memoria del tipo di stringa JavaScript con valori identici

5

Il tipo di stringa JavaScript è immutabile, ma significa che stringhe identiche condivideranno la memoria?

Diciamo che due stringhe sono create in luoghi completamente diversi, un motore JavaScript moderno dovrebbe essere abbastanza intelligente da non raddoppiare la quantità di memoria per ogni "copia" e solo riutilizzare quello già creato (che esiste da qualche parte nella memoria)?

Diciamo che abbiamo:

var foo = sha256(fooInput); 
//  ... somewhere else
var bar = sha256(barInput);

// Say foo and bar is identical: "foo === bar" => true
// Would they share memory? 

Fa alcuna differenza se il valore della stringa è una chiave negli oggetti? Esempio:

var cars = {
  "john": {
    // information about all cars "john" owns.
  }
};

var computers = {
  "john": {
    // information about all computers "john" owns.
  }
};

var phones = {
  "john": {
    // information about all phones "john" owns.
  }
};

La stringa "john" nell'esempio sopra occuperà la memoria di tre o una stringa di "john"?

    
posta Fredrik 26.07.2016 - 17:53
fonte

2 risposte

6

Il processo di condivisione delle stringhe in questo modo si chiama String Interning, e sì, Javascript lo fa. Il modo in cui viene eseguito lo interning delle stringhe in Javascript è un dettaglio dell'implementazione e varia tra le diverse implementazioni di Javascript.

Dal punto di vista delle prestazioni, probabilmente non dovresti preoccuparti di ciò a meno che non diventi un problema significativo per l'applicazione che hai identificato in modo specifico con uno strumento di profilazione.

    
risposta data 26.07.2016 - 18:14
fonte
1

Risposta breve: a volte sì, a volte no.

Sono incappato anche nella stessa domanda e ci ho guardato un po 'dentro. Sembra che l'interning sia fatto di solito per primitive di stringhe che sono generate allo stesso modo (ad esempio assegnando sempre la stessa stringa a una variabile nello stesso ciclo), ma sono stato anche in grado di creare un esempio che ha come risultato la creazione di due stringhe identiche con due riferimenti diversi:

Come puoi vedere, ogni stringa viene archiviata due volte, con riferimenti diversi.

Questo è il codice che ho usato per generare le stringhe duplicate:

const a = [];
const b = [];

for(let j  =1; j<= 100;++j){
    for(let i = 1; i <= 10000; ++i) a[i] = 'player 1 got 5 points from player 2' + i;
    const c = '1';
    for(let i = 2; i <= 20000; ++i) b[i] = 'player 1 got 5 points from player 2' + (i/2 | 0);
}
    
risposta data 31.10.2018 - 12:07
fonte

Leggi altre domande sui tag