String.prototype performansını genişletme sorusunun ardından gerçekten meraklandım , çünkü "use strict"
bir String.prototype
yönteme sadece 10 kat daha iyi performans ekledim . Açıklama ile Bergi kısadır ve bana açıklamaz. Neredeyse aynı iki yöntem arasında neden yalnızca "use strict"
en üstte farklılık gösteren bu kadar çarpıcı bir fark var ? Daha detaylı olarak ve bunun arkasındaki teori ile açıklayabilir misiniz?
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');
Sonuç:
proto: 101 ms
proto-strict: 7.5 ms
this[i] === char
Bir DOM ortamında test ettim ve sonuç aynı
count
işlevi çağırdığınızda, this
parametrenin bir dizge değişmezi yerine bir dizge nesnesine dönüştürülmesi gerektiğini, ancak katı modda doğru şekilde çalışması için gerekli olmadığını söyler . Neden bu durum benim dışımda, cevapla çok ilgileniyorum.
this
, ancak katı modda bu adımı atlar, böylece ilkel dizeyi veya sağlanan her şeyi elde edersiniz this
.
"use strict";
çocuklar! Goooold
this[i] === char
yapıp aynı farkı alıp almadığınızı görebilir misiniz?