Uso de memória do tipo de string JavaScript com valores idênticos

5

O tipo de string JavaScript é imutável, mas significa que strings idênticas compartilharão a memória?

Digamos que duas strings são criadas em locais diferentes, um mecanismo JavaScript moderno será inteligente o suficiente para não duplicar a quantidade de memória para cada "cópia" e apenas reutilizar a que já foi criada (que existe em algum lugar na memória)?

Digamos que recebemos:

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

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

Faz alguma diferença se o valor da string for uma chave em objetos? Exemplo:

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.
  }
};

A string "john" no exemplo acima ocupa a memória de três ou uma string de "john"?

    
por Fredrik 26.07.2016 / 17:53
fonte

2 respostas

6

O processo de compartilhar strings dessa maneira é chamado String Interning, e sim, Javascript faz isso. A maneira pela qual a internação de strings é realizada em Javascript é um detalhe de implementação, e varia entre diferentes implementações de Javascript.

Do ponto de vista do desempenho, você provavelmente não deve se preocupar com isso, a menos que se torne um problema significativo que afeta seu aplicativo e que você identificou especificamente com uma ferramenta de criação de perfil.

    
por 26.07.2016 / 18:14
fonte
0

Resposta curta: às vezes sim, às vezes não.

Eu também tropecei na mesma pergunta e olhei um pouco para ela. Parece que o interning é feito geralmente para primitivos de strings que são gerados da mesma maneira (por exemplo, sempre atribuindo a mesma string a uma variável no mesmo loop), MAS também consegui criar um exemplo que resulta em duas strings idênticas sendo criadas com duas referências diferentes:

Como você pode ver, cada string é armazenada duas vezes, com referências diferentes.

Este é o código que usei para gerar as sequências duplicadas:

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);
}
    
por 31.10.2018 / 12:07
fonte