Tamanho máximo de uma matriz em JavaScript

Contexto: Estou construindo um pequeno site que lê um feed RSS e atualiza / verifica o feed em segundo plano. Eu tenho uma matriz para armazenar dados para exibir e outro que armazena IDs de registros que foram mostrados.

Pergunta: Quantos itens uma matriz pode conter em JavaScript antes que as coisas comecem a ficar lentas ou lentas. Eu não estou classificando a matriz, mas estou usando a function inArray do jQuery para fazer uma comparação.

O site ficará em execução e será atualizado, e é improvável que o navegador seja reiniciado / atualizado com frequência.

Se eu pensar em limpar alguns registros da matriz, qual é a melhor maneira de remover alguns registros após um limite, como 100 itens.

O tamanho máximo até que “fique lento” é totalmente dependente de sua máquina de destino e seu código real, então você precisa testar sobre essa (s) plataforma (s) para ver o que é aceitável.

No entanto, o comprimento máximo de um array de acordo com a especificação ECMA-262 5th Edition é vinculado por um inteiro de 32 bits sem sinal devido à operação abstrata ToUint32 , portanto o array mais longo possível poderia ter 2 32 -1 = 4,294,967,295 = 4,29 bilhões de elementos .

Não há necessidade de aparar o array, simplesmente endereçá-lo como um buffer circular (index% maxlen). Isso garantirá que ele nunca ultrapasse o limite (implementar um buffer circular significa que, uma vez que você chega ao fim, volta ao início novamente – não é possível ultrapassar o final do array).

Por exemplo:

var container = new Array (); var maxlen = 100; var index = 0; // 'store' 1538 items (only the last 'maxlen' items are kept) for (var i=0; i<1538; i++) { container [index++ % maxlen] = "storing" + i; } // get element at index 11 (you want the 11th item in the array) eleventh = container [(index + 11) % maxlen]; // get element at index 11 (you want the 11th item in the array) thirtyfifth = container [(index + 35) % maxlen]; // print out all 100 elements that we have left in the array, note // that it doesn't matter if we address past 100 - circular buffer // so we'll simply get back to the beginning if we do that. for (i=0; i<200; i++) { document.write (container[(index + i) % maxlen] + "
\n"); }

Você poderia tentar algo assim para testar e aparar o comprimento:

http://jsfiddle.net/orolo/wJDXL/

 var longArray = [1, 2, 3, 4, 5, 6, 7, 8]; if (longArray.length >= 6) { longArray.length = 3; } alert(longArray); //1, 2, 3 

Eu construí uma estrutura de desempenho que manipula e grava milhões de conjuntos de dados e, mesmo assim, a latência de cálculo do javascript era da ordem de dezenas de milissegundos. A menos que você esteja preocupado em ultrapassar o limite de tamanho da matriz, não acho que você tenha muito com o que se preocupar.

Será muito dependente do navegador. 100 itens não soam como um grande número – eu espero que você possa ir muito mais alto do que isso. Milhares não deveriam ser um problema. O que pode ser um problema é o consumo total de memory.

Eu descaradamente coloquei alguns conjuntos de dados muito grandes na memory, e embora tenha sido lento, foram necessários 15 milhões de dados para cima com cálculos bastante intensos no dataset. Duvido que você tenha problemas com a memory, a menos que você tenha cálculos intensos sobre os dados e muitas linhas. Criação de perfil e benchmarking com conjuntos de resultados simulados diferentes será sua melhor aposta para avaliar o desempenho.