Durante o desenvolvimento do script, uma corda grande é frequentemente combinada e emendada em uma corda grande para saída de acordo com uma determinada regra. Por exemplo, ao escrever controles de script, a saída de tags HTML que controlam a aparência de todo o controle. Por exemplo, ao analisar dinamicamente as tags HTML após a obtenção do valor de retorno do lado do servidor no AJAX, não discutirei a aplicação específica de strings de emenda aqui. Eu só quero discutir a eficiência de emenda aqui.
Quando escrevemos código, usamos o operador " +=", s += string; Esta é a maneira mais familiar de escrever. Gostaria de saber se você notou. Quando a capacidade combinada da string é dezenas de k ou mesmo centenas de k, o script é muito lento para executar e a taxa de uso da CPU é muito alta, por exemplo:
A cópia do código é a seguinte:
var str = "01234567891123456789212345678931234567894123456789";
str+= "51234567896123456789712345678981234567899123456789/n";
var resultado = "";
for (var i = 0; i <2000; i ++) resultado+= str;
Em apenas uma etapa, a sequência de resultados gerada é 200k, que leva 1,1 segundos (isso está relacionado à configuração do computador) e o pico da CPU é 100%. (Fiz mais loops para ver o efeito mais intuitivamente). Pode -se imaginar que apenas um passo da operação levou mais de um segundo e, juntamente com o tempo gasto em outros códigos, o tempo de execução de todo o bloco de script seria insuportável. Então, existe uma solução de otimização? Existe alguma outra maneira? É claro que há uma resposta, caso contrário, eu seria um absurdo para escrever este artigo.
Uma maneira mais rápida é usar uma matriz. Ao espalhar loops, não é para secá -lo em uma certa string, mas colocar a string em uma matriz e, finalmente, usar a matriz.Join ("" ") para obter a sequência de resultados. Exemplo de código:
A cópia do código é a seguinte:
var str = "01234567891123456789212345678931234567894123456789";
str+= "51234567896123456789712345678981234567899123456789/n";
var resultado = "", a = new Array ();
for (var i = 0; i <2000; i ++) a [i] = str;
resultado = A.Join (""); a = nulo;
Você pode testar e testar o tempo necessário para combinar uma corda do mesmo tamanho. O resultado que testei aqui é: <15 milissegundos. Observe que sua unidade é milissegundos. Ou seja, combinando uma corda de 200k, o consumo de tempo dos dois modos é de cerca de duas ordens de magnitude. O que isso significa? Isso significa que o último terminou seu trabalho e voltou do almoço, enquanto o primeiro ainda está trabalhando como coolie. Vou escrever 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, estou testando o primeiro que leva meio minuto para ser concluído, e o último que leva 0,07 segundos (10.000 loops).
A cópia do código é a seguinte:
<Body>
Número de tempos de splicing de string <input id = "totle" value = "1000" size = "5" maxlength = "5">>
<input type = "button" value = "String Splicing Method" OnClick = "Method1 ()">
<input type = "button" value = "Método de junção de atribuição de matriz" onclick = "method2 ()"> <br>
<div id = "Method1"> </div>
<div id = "Method2"> </div>
<textarea id = "show"> </sexttarea>
<Script Language = "JavaScript">
<!-
// O comprimento dessa corda sendo emendado é 100 bytes autor: Meizz
var str = "01234567891123456789212345678931234567894123456789";
str+= "51234567896123456789712345678981234567899123456789/n";
// Método 1
Função Método1 ()
{
var resultado = "";
var TOTLE = parseInt (document.getElementById ("TOTLE"). Valor);
var n = new Date (). getTime ();
for (var i = 0; i <totle; i ++)
{
resultado += str;
}
document.getElementById ("show"). value = resultado;
var s = "Método de splicing de string: a corda grande emendada é longa"+ resultado.length+ "byte",+
"Tempo dividido" + (new Date (). GetTime ()-n) + "milissegundos!";
Document.getElementById ("Method1"). Innerhtml = S;
}
// Método 2
Função Método2 ()
{
var resultado = "";
var TOTLE = parseInt (document.getElementById ("TOTLE"). Valor);
var n = new Date (). getTime ();
var a = new Array ();
for (var i = 0; i <totle; i ++)
{
a [i] = str;
}
resultado = A.Join (""); a = nulo;
document.getElementById ("show"). value = resultado;
var s = "Método de junção de atribuição de matriz: a corda grande emendada é longa" + resultado.length + "byte", +
"Tempo dividido" + (new Date (). GetTime ()-n) + "milissegundos!";
Document.getElementById ("Method2"). Innerhtml = S;
}
//->
</Script>
Finalmente, direi mais algumas palavras. Todas as unidades de splicing de cordas usarão as junções de matriz no futuro? Isso depende de suas necessidades reais. Não há necessidade de usar o método da matriz para combinações comuns de vários bytes de nível K ou de K, porque as variáveis de abertura da matriz também são consumidas. Se houver mais de algumas combinações de cordas K, isso significa que a matriz é eficiente.
Ou seja, 6.0:
Método de splicing de cordas: A corda grande emendada tem 1010.000 bytes de comprimento, e a emenda leva 22.089 milissegundos!
Método de junção de atribuição de matriz: A corda grande emendada tem 1010.000 bytes de comprimento e leva 218 milissegundos para unir!
Firefox 1.0:
Método de splicing de cordas: A corda grande emendada tem 1010.000 bytes de comprimento, e a emenda leva 1044 milissegundos!
Método de junção de atribuição de matriz: A corda grande emendada tem 1010.000 bytes de comprimento, e a emenda leva 1044 milissegundos!
Mozilla 1.7:
Método de splicing de cordas: A corda grande emendada tem 1010.000 bytes de comprimento, e a emenda leva 1045 milissegundos!
Método de junção de atribuição de matriz: A corda grande emendada tem 1010.000 bytes de comprimento, e a emenda leva 1044 milissegundos!
Netscape 7.0:
Método de splicing de cordas: A corda grande emendada tem 1010.000 bytes de comprimento, e a emenda leva 10.273 milissegundos!
Método de junção de atribuição de matriz: A corda grande emendada tem 1010.000 bytes de comprimento e leva 1138 milissegundos para unir!
Opera 7.54:
Método de splicing de cordas: A corda grande emendada tem 1010.000 bytes de comprimento, e a emenda leva 6968 milissegundos!
Método de junção de atribuição de matriz: A corda grande emendada tem 1010.000 bytes de comprimento, e a emenda leva 6922 milissegundos!
Os resultados do teste de 10.000 ciclos mostram que a eficiência pode ser bastante aprimorada no IE e no Netscape, enquanto na Opera do Firefox Mozilla, os dois métodos levam quase ao mesmo tempo. Esses dados podem ser suficientes para determinar que o método de junção da matriz é melhor que o splicing de cordas tradicional.