Durante o processo de desenvolvimento do script, uma string grande geralmente é combinada e emendada para saída de acordo com uma determinada regra. Por exemplo, ao escrever um controle de script, a saída da tag HTML que controla a aparência de todo o controle ou ao analisar e criar tags HTML dinamicamente após obter o valor de retorno do lado do servidor em AJAX, mas não discutirei a aplicação específica de emendando cordas aqui. Eu só quero discutir a eficiência da emenda aqui.
Quando escrevemos emenda de string, sempre usamos o operador "+=", s += String Este é o método de escrita mais familiar. Não sei se você notou que a capacidade da string combinada é Quando o número é. dezenas ou mesmo centenas de K, a execução do script é muito lenta e o uso da CPU é extremamente alto, por exemplo:
var str = "01234567891123456789212345678931234567894123456789";
str+= "51234567896123456789712345678981234567899123456789n";
var resultado = "";
for(var i=0; i<2000; i++) result += str;
Em apenas uma etapa, a string de resultado é 200K, leva 1,1 segundos (isso está relacionado à configuração do computador) e o valor de pico da CPU é 100 %. (Para ver o efeito de forma mais intuitiva, fiz mais alguns loops). É concebível que tal etapa de operação consuma mais de um segundo do meu tempo. Juntamente com o consumo de tempo de outros códigos, o tempo de execução de todo o bloco de script se torna insuportável. Existe alguma solução de otimização? Existe alguma outra maneira? A resposta é sim, claro, caso contrário, seria um absurdo escrever este artigo.
A maneira mais rápida é usar um array. Ao unir em um loop, em vez de uni-lo em uma string, a string é colocada em um array e, finalmente, array.join("") é usado para obter o exemplo de código do resultado. :
varstr = "01234567891123456789212345678931234567894123456789";
str+= "51234567896123456789712345678981234567899123456789n";
var resultado = "", a = new Array();
for(var i=0; i<2000; i++) a[i] = str;
result = a.join(""); a = null;
Você pode testar o tempo que leva para combinar uma string do mesmo tamanho. O resultado que testei aqui é: <15 milissegundos. o que significa que para montar uma sequência de 200K, o consumo de tempo dos dois modos é de quase duas ordens de grandeza. o que isso significa? Isso significa que este último terminou o trabalho e voltou do almoço, enquanto o primeiro ainda trabalha duro. Eu escrevi uma página de teste. Você pode copiar o código a seguir e salvá-lo como um arquivo HTM e abri-lo na página da web para testar a diferença de eficiência entre os dois. De qualquer forma, o que testei é que o primeiro leva meio minuto para ser concluído. , e o último Ou pode ser feito em 0,07 segundos (loop 10.000 vezes).
<corpo>
Número de concatenações de strings<input id="totle" value="1000" size="5" maxlength="5">
<input type="button" value="Método de emenda de string" onclick="method1()">
<input type="button" value="Método de junção de atribuição de array" onclick="method2()"><br>
<div id="method1"> </div>
<div id="method2"> </div>
<textarea id="show" style="largura: 100%; altura: 400"></textarea>
<SCRIPT LANGUAGE="JavaScript">
<!--
//O comprimento desta string emendada é de 100 bytes autor: meizz
varstr = "01234567891123456789212345678931234567894123456789";
str+= "51234567896123456789712345678981234567899123456789n"
;
função método1()
{
var resultado = "";
var totle = parseInt(document.getElementById("totle").value);
var n = new Date().getTime();
for(var i=0; i<totle; i++)
{
resultado +=str;
}
document.getElementById("mostrar").valor = resultado;
var s = "Método de emenda de string: o comprimento da string grande após a emenda"+ result.length +"bytes,"+
"A emenda leva tempo" + (new Date().getTime()-n) + "Milissegundos!";
document.getElementById("método1").innerHTML = s;
}
//Método 2
função método2()
{
var resultado = "";
var totle = parseInt(document.getElementById("totle").value);
var n = new Date().getTime()
;
for(var i=0; i<totle; i++)
{
uma[i] = string;
}
resultado = a.join(""); a=null;
document.getElementById("mostrar").valor = resultado;
var s = "Método de junção de atribuição de array: o comprimento da string grande após a emenda"+ result.length +"bytes,"+
"A emenda leva tempo" + (new Date().getTime()-n) + "Milissegundos!";
document.getElementById("método2").innerHTML = s;
}
//-->
</SCRIPT>
Finalmente, deixe-me dizer algumas palavras. A junção de array será usada para emenda de strings no futuro? Isso depende de suas necessidades reais. Para combinações comuns de alguns bytes ou de nível K, não há necessidade de usar o método array, porque abrir variáveis de array também é caro. Se houver mais do que algumas combinações de strings K, a eficiência da matriz será alta.
-------------------------------------------------- ----------
IE 6.0:
Método de emenda de string: a string grande emendada tem 1.010.000 bytes de comprimento e a emenda leva 22.089 milissegundos!
Método de junção de atribuição de array: a string grande emendada tem 1.010.000 bytes de comprimento e a emenda leva 218 milissegundos!
Firefox 1.0:
Método de emenda de string: a string grande emendada tem 1.010.000 bytes de comprimento e a emenda leva 1.044 milissegundos!
Método de junção de atribuição de array: a string grande emendada tem 1.010.000 bytes de comprimento e a emenda leva 1.044 milissegundos!
Mozilla 1.7:
Método de emenda de string: a string grande emendada tem 1.010.000 bytes de comprimento e a emenda leva 1.045 milissegundos!
Método de junção de atribuição de array: a string grande emendada tem 1.010.000 bytes de comprimento e a emenda leva 1.044 milissegundos!
Netscape 7.0:
Método de emenda de string: a string grande emendada tem 1.010.000 bytes de comprimento e a emenda leva 10.273 milissegundos!
Método de junção de atribuição de array: a string grande emendada tem 1.010.000 bytes de comprimento e a emenda leva 1.138 milissegundos!
Ópera 7.54:
Método de emenda de string: a string grande emendada tem 1.010.000 bytes de comprimento e a emenda leva 6.968 milissegundos!
Método de junção de atribuição de array: a string grande emendada tem 1.010.000 bytes de comprimento e a emenda leva 6.922 milissegundos!
Os resultados do teste de looping 10.000 vezes mostram que a eficiência pode ser bastante melhorada no IE e no Netscape, enquanto o consumo de tempo dos dois métodos no Firefox Mozilla Opera é basicamente semelhante. Esses dados são suficientes para determinar que o método de junção de array é melhor do que. emenda de cordas tradicional.