tips speed latest fast current javascript performance

javascript - speed - performance html



¿Por qué "usar estricto" mejora el rendimiento 10 veces en este ejemplo? (1)

Siguiendo la pregunta Extendiendo el rendimiento de String.prototype Estoy realmente intrigado, porque solo agregar "use strict" a un método String.prototype mejoró el rendimiento 10 veces. La explanation de bergi es corta y no me la explica. ¿Por qué hay una diferencia tan dramática entre dos métodos casi idénticos, que solo difieren en "use strict" en la parte superior? ¿Puedes explicar con más detalle y con la teoría detrás de esto?

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


En modo estricto, this contexto no está obligado a ser un objeto. Si llama a una función en un no objeto, será simplemente ese no objeto.

Por el contrario, en modo no estricto, this contexto siempre se envuelve primero en un objeto si aún no es un objeto. Por ejemplo, (42).toString() primero envuelve 42 en un objeto Number y luego llama a Number.prototype.toString con el objeto Number como this contexto. En modo estricto, this contexto se deja intacto y solo llama a Number.prototype.toString con 42 como this contexto.

(function() { console.log(typeof this); }).call(42); // ''object'' (function() { ''use strict''; console.log(typeof this); }).call(42); // ''number''

En su caso, la versión en modo no estricto pasa mucho tiempo envolviendo y desenvolviendo string primitivas en envoltorios de objetos de String y viceversa. La versión en modo estricto, por otro lado, funciona directamente en la string primitiva, lo que mejora el rendimiento.