Após a pergunta Estendendo o desempenho do String.prototype , estou realmente intrigado, porque apenas adicionar "use strict"
um String.prototype
método melhorou o desempenho 10 vezes. A explicação de Bergi é curta e não me explica. Por que existe uma diferença tão dramática entre dois métodos quase idênticos, que apenas diferem no "use strict"
topo? Você pode explicar com mais detalhes e com a teoria por trás disso?
String.prototype.count = function(char) {
var n = 0;
for (var i = 0; i < this.length; i++)
if (this[i] == char) n++;
return n;
};
String.prototype.count_strict = function(char) {
"use strict";
var n = 0;
for (var i = 0; i < this.length; i++)
if (this[i] == char) n++;
return n;
};
// Here is how I measued speed, using Node.js 6.1.0
var STR = '0110101110010110100111010011101010101111110001010110010101011101101010101010111111000';
var REP = 1e4;
console.time('proto');
for (var i = 0; i < REP; i++) STR.count('1');
console.timeEnd('proto');
console.time('proto-strict');
for (var i = 0; i < REP; i++) STR.count_strict('1');
console.timeEnd('proto-strict');
Resultado:
proto: 101 ms
proto-strict: 7.5 ms
javascript
performance
exebook
fonte
fonte
this[i] === char
e ver se obtém a mesma diferença?this[i] === char
num ambiente de DOM e o resultado é o mesmocount
função, othis
parâmetro deve ser convertido em um objeto de string em vez de em um literal de string, enquanto no modo estrito não é necessário para operar corretamente. Por que esse é o caso está além de mim, estou muito interessado na resposta.this
, mas, no modo estrito, pula essa etapa, para que você obtenha a string primitiva ou o que for fornecidothis
."use strict";
todos os lugares meninos! GooooldRespostas:
No modo estrito, o
this
contexto não é forçado a ser um objeto. Se você chamar uma função em um não-objeto,this
será apenas esse não-objeto.Por outro lado, no modo não estrito, o
this
contexto é sempre primeiro envolvido em um objeto se ele ainda não é um objeto. Por exemplo,(42).toString()
primeiro envolve42
umNumber
objeto e depois chamaNumber.prototype.toString
oNumber
objeto comothis
contexto. No modo estrito, othis
contexto é deixado chamadas intocadas e apenasNumber.prototype.toString
com42
comothis
contexto.No seu caso, a versão em modo não estrito gasta muito tempo agrupando e desembrulhando
string
s primitivos emString
invólucros de objetos e vice-versa. A versão em modo estrito, por outro lado, funciona diretamente no primitivostring
, o que melhora o desempenho.fonte
with
também ajuda um pouco para cada pesquisa de variáveis IIRC.with
ajuda imensamente , pois permite ao navegador raciocinar qual expressão de variável se refere a qual variável.this
seja "mais rigoroso" que o sempre-objetothis
.this
énull
ouundefined
, que seria o objeto global no modo desleixado.this
" vs. "invólucrothis
", se quiser. Os wrappers de objetos são um kludge que nunca deveria existir, portanto, faz sentido que o modo estrito os evite mais quando possível.