ต่อไปนี้เป็นคำถามที่ขยายประสิทธิภาพ String.prototypeฉันกำลังทึ่งจริงๆเพราะเพียงการเพิ่ม"use strict"
กับString.prototype
ประสิทธิภาพการทำงานวิธีการที่ดีขึ้น 10 ครั้ง คำอธิบายโดยbergiเป็นระยะสั้นและไม่ได้อธิบายให้ฉัน ทำไมถึงมีความแตกต่างอย่างมากระหว่างสองวิธีที่เหมือนกันเกือบจะแตกต่างกัน"use strict"
ที่ด้านบนเท่านั้น? คุณสามารถอธิบายรายละเอียดเพิ่มเติมและทฤษฎีที่อยู่เบื้องหลังสิ่งนี้ได้ไหม?
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 และผลลัพธ์จะเหมือนกัน
count
ฟังก์ชันthis
พารามิเตอร์จะต้องถูกส่งไปยังวัตถุสตริงแทนสตริงตัวอักษรในขณะที่อยู่ในโหมดเข้มงวดไม่จำเป็นต้องดำเนินการอย่างถูกต้อง ทำไมเป็นกรณีนี้เกินฉันฉันสนใจคำตอบ
this
แต่ในโหมดเข้มงวดมันข้ามขั้นตอนนั้นเพื่อให้คุณได้รับดั้งเดิมthis
สตริงหรือสิ่งที่ได้รับการจัดเตรียมไว้ให้
"use strict";
เด็ก ๆ ไปทุกที่! Goooold
this[i] === char
และดูว่าคุณได้รับความแตกต่างกันหรือไม่?