Suite à la question Extension des performances de String.prototype, je suis vraiment intrigué, car le simple fait d'ajouter "use strict"
à une String.prototype
méthode améliore les performances 10 fois. L' explication de bergi est courte et ne me l'explique pas. Pourquoi y a-t-il une différence si dramatique entre deux méthodes presque identiques, qui ne diffèrent que par "use strict"
le haut? Pouvez-vous expliquer plus en détail et avec la théorie derrière cela?
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');
Résultat:
proto: 101 ms
proto-strict: 7.5 ms
javascript
performance
exebook
la source
la source
this[i] === char
et voir si vous obtenez la même différence?this[i] === char
dans un environnement DOM et le résultat est le mêmecount
fonction, lethis
paramètre doit être converti en un objet chaîne au lieu d'une chaîne littérale alors qu'en mode strict, il n'est pas nécessaire de le faire pour fonctionner correctement. Pourquoi c'est le cas me dépasse, je suis très intéressé par la réponse.this
, mais en mode strict, il saute cette étape, vous obtenez donc la chaîne primitive , ou tout ce qui a été prévuthis
."use strict";
partout les garçons! GooooldRéponses:
En mode strict, le
this
contexte n'est pas forcé d'être un objet. Si vous appelez une fonction sur un non-objet, cethis
ne sera que ce non-objet.En revanche, en mode non strict, le
this
contexte est toujours d'abord enveloppé dans un objet s'il n'est pas déjà un objet. Par exemple,(42).toString()
encapsule d'abord42
unNumber
objet, puis appelleNumber.prototype.toString
avec l'Number
objet commethis
contexte. En mode strict, lethis
contexte n'est pas touché et appelle simplementNumber.prototype.toString
avec42
commethis
contexte.Dans votre cas, la version en mode non strict passe beaucoup de temps à envelopper et à dérouler les primitives
string
dansString
encapsuler et à wrappers d'objets et inversement. La version en mode strict fonctionne par contre directement sur la primitivestring
, ce qui améliore les performances.la source
with
aide également un peu pour chaque iirc de recherche de variable.with
aide énormément car elle permet au navigateur de raisonner quelle expression de variable fait référence à quelle variable.this
soit "plus strict" que toujours l'objetthis
.this
estnull
ouundefined
, qui serait l'objet global en mode bâclé.this
" ou "wrapperthis
" si vous le souhaitez. Les wrappers d'objets sont un kludge qui n'aurait jamais dû exister, il est donc logique que le mode strict les évite davantage lorsque cela est possible.