gpt4 book ai didi

javascript - 为什么我的原型(prototype)这么慢?

转载 作者:搜寻专家 更新时间:2023-11-01 05:09:44 25 4
gpt4 key购买 nike

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

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

现在事实证明这非常慢:我尝试了这个“基准测试”(我真的不知道如何正确地做这些事情,但这无论如何都证明了我的观点):

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);

第一个脚本在 chrome 中大约需要 3000 毫秒(chrome 是我正在使用的也是我感兴趣的),而第二个脚本只需要 24 毫秒 - 整整 125 倍更快 .扩展现有类 javascript 只是一个非常糟糕的主意吗?这是怎么回事?

最佳答案

原因是要应用isBetween 方法,主题k 需要转换为Number 对象。这称为装箱primitive wrapping .

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

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

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

严格模式

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

the value passed as this to a function in strict mode is not forced into being an object (a.k.a. "boxed"). [...] automatic boxing [is] a performance cost [...] Thus for a strict mode function, the specified this is not boxed into an object.

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

"use strict";

关于javascript - 为什么我的原型(prototype)这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42040211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com