Extending String.prototype performanceの質問に続いて、"use strict"
をString.prototype
メソッドに追加するだけでパフォーマンスが10倍向上したので、私は本当に興味を持っています。 explanationとbergiは短いので、私には説明しません。なぜ、2つのほとんど同じ方法の間にこのような劇的な違いがありますか?それは、"use strict"
が一番上に違いがありますか?あなたはこれの背後にある理論とより詳細に説明できますか?この例では、「use strict」はパフォーマンスを10倍向上させる理由は何ですか?
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');
結果:
proto: 101 ms
proto-strict: 7.5 ms
'this [i] === char'でテストをして、同じ違いがあるかどうか確認できますか? –
DOM環境で 'this [i] === char'を使ってテストした結果は同じです –
bergiの説明によると、' count'関数を呼び出すと、 'this'パラメータは文字列にキャストされなければなりません厳密なモードでは正しく動作する必要はありませんが、文字列リテラルの代わりにオブジェクトを使用します。なぜこのケースが私を超えているのか、私はその答えに非常に興味があります。 –