为什么我的原型这么慢?

时间:2017-02-04 12:11:55

标签: javascript prototype benchmarking

好的,所以我编写了这个简单的javascript函数,使我的代码更具可读性:

Number.prototype.isBetween=function(a,b){
    return(this>=a&&this<b);
};

现在结果非常缓慢:我试过这个&#34;基准测试&#34; (我真的不知道如何正确地做这些事情,但这证明了我的观点):

var res=0;
var k=20;
var t=new Date().getTime();
for(var i=0;i<10000000;i++){if(k.isBetween(13,31)){res++;}}
console.log(new Date().getTime()-t);

var res=0;
var k=20;
var t=new Date().getTime();
for(var i=0;i<10000000;i++){if(k>=13&&k<31)){res++;}}
console.log(new Date().getTime()-t);

并且第一个脚本需要大约3000毫秒的chrome(而chrome是我正在使用的和我感兴趣的东西),而第二个脚本只需要24ms - 整个因子125 更快。是扩展现有的类javascript提供了一个非常糟糕的主意?这是怎么回事?

1 个答案:

答案 0 :(得分:8)

原因是,对于要应用的方法isBetween,主题 k 需要转换为Number对象。这称为拳击primitive wrapping

然后应用isBetween方法,比较运算符>将需要从this对象中检索原始值,...两次。

这是附加函数调用(涉及堆栈)之上的所有额外开销。

这个总开销比需要发生的实际比较更多,因此性能影响相对较大。

严格模式

正如@Bergi在下面的评论中提到的,上述包裹does not happen in strict mode MDN

  

作为this传递给 strict mode 中的函数的值不会被强制成为对象(a.k.a。“boxed”)。 [...]自动装箱[是]性能成本[...]因此对于严格模式函数,指定的this不会被装入对象。

当切换到严格模式时,您会发现增加的性能成本会消失:

"use strict";