javascript - timing使用 - window.performance.measure



在此示例中,为什么“严格使用”将性能提高10倍? (1)

在严格模式下,不会 this 上下文强制为对象。 如果在非对象上调用函数,则该函数将只是该非对象。

相反,在非严格模式下,如果 this 上下文尚不是对象,则始终首先将其包装在对象中。 例如, (42).toString() 首先将 42 包裹在 Number 对象中,然后以 Number 对象作为 this 上下文调用 Number.prototype.toString 。 在严格模式下, this 上下文保持不变, Number.prototype.toString 42 作为 this 上下文调用 Number.prototype.toString

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

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

在您的情况下,非严格模式版本会花费大量时间将原始 string s包装和解包到 String 对象包装器中并返回。 另一方面,严格模式版本可直接在原始 string ,从而提高了性能。

我对 扩展Exting String.prototype性能 的问题 感兴趣,因为仅在 String.prototype 方法中添加 "use strict" 即可将性能提高10倍。 bergi 的 explanation 很短,没有向我解释。 为什么两种几乎完全相同的方法之间有如此巨大的差异,只是顶部的 "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




performance