gpt4 book ai didi

javascript - 如果未设置 key ,则设置 key - 哪种方式最有效?

转载 作者:搜寻专家 更新时间:2023-10-31 23:11:41 24 4
gpt4 key购买 nike

检查对象上是否设置了键的最有效方法是什么,如果没有,则将其设置为给定值?请记住,这仅适用于高性能情况

让我们假设 someCoSTLyOperation() 需要大量 CPU 时间来计算并且从不返回虚假值

方法#1

if(!myObj.myKey) myObj.myKey = someCostlyOperation();

方法#2

myObj.myKey = myObj.myKey || someCostlyOperation();

总结:

  • 方法 #1 检查 myKey 是否为假。如果 undefined,它会将其设置为 someCoSTLyOperation()

  • 方法 #2 没有条件,但总是重新分配 myObj.myKey。如果为假,则将其设置为 someCoSTLyOperation()

性能上的差异可能并不显着,但在嵌套循环中,这条线被评估数万次,每一个小的优化都很重要,以减少执行时间并提高整体应用程序性能。

我认为方法 #1 更快,因为它对 myObj.myKey 进行的检查与方法 #2 进行的检查相同,但不会每次都无用地重新分配它。不过我可能是错的,因为我不知道 Javascript 解释器对这样的代码所做的所有内部优化(在我的例子中它使用 Node.js 运行)。

实现此目标的最佳方法是什么?


编辑

Arnauld 在评论中提出了第三种方法。在这里:

方法#3

!myObj.myKey && (myObj.myKey = someCostlyOperation());

最佳答案

这基本上是所有 3 种方法之间的联系。

(function(){
var myObj = { };

var time1,time2,testTime1,testTime2,testTime3,test1Wins=0,test2Wins=0,test3Wins=0,noWinner=0;
function someCostlyOperation(){
for(var i=0; i<100000; i++){

}
return {};
}


function method1(){
if(!myObj.myKey) myObj.myKey = someCostlyOperation();
}

function method2(){
myObj.myKey = myObj.myKey || someCostlyOperation();
}

function method3(){
!myObj.myKey && (myObj.myKey = someCostlyOperation());
}


for(var i=0;i<10000;i++){

delete myObj.myKey;
time1 = performance.now();
method3();
time2 = performance.now();
testTime1 = time2-time1;

delete myObj.myKey;
time1 = performance.now();
method2();
time2 = performance.now();
testTime2 = time2-time1;

delete myObj.myKey;
time1 = performance.now();
method3();
time2 = performance.now();
testTime3 = time2-time1;


if(testTime1<testTime2 && testTime1<testTime3){
test1Wins++;
}
else if(testTime2<testTime3 && testTime2<testTime1){
test2Wins++;
}
else if(testTime3<testTime1 && testTime3<testTime2){
test3Wins++;
}
else{
noWinner++;
}

}

console.log("test1Wins:",test1Wins);
console.log("test2Wins:",test2Wins);
console.log("test3Wins:",test3Wins);
console.log("noWinners:",noWinner);
})();

关于javascript - 如果未设置 key ,则设置 key - 哪种方式最有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38250695/

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