如果未设置,请设置密钥 - 哪种方式最有效
Setting a key if it's not set - which way is the most efficient?
检查是否在对象上设置了键的最有效方法是什么,如果没有,则将其设置为给定值?请记住,这仅适用于高性能案例
假设someCostlyOperation()
需要大量的 CPU 时间来计算,并且从不返回错误值
方法#1
if(!myObj.myKey) myObj.myKey = someCostlyOperation();
方法#2
myObj.myKey = myObj.myKey || someCostlyOperation();
总结:
方法#1检查myKey是否是假的。如果
undefined
,则会将其设置为someCostlyOperation()
。方法 #2 没有条件,但总是重新分配
myObj.myKey
.如果为假,则将其设置为someCostlyOperation()
。
差异可能并不显著,但在嵌套循环中,此行被评估数万次,为了缩短执行时间并提高整体应用程序性能,每个小的优化都很重要。
我假设方法 #1 更快,因为它对方法 #2 所做的myObj.myKey
进行相同的检查,但是,每次都没有无用地重新分配它。不过我可能是错的,因为我不知道 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);
})();
相关文章:
- 2个表,需要为每个匹配行设置具有最大高度的行
- 为什么可以't我在Android WebView onLayout中设置了最大宽度
- 在滚动中旋转元素,哪种方式最轻
- 哪种循环方式最快?[出于好奇]
- 如何通过javascript或jquery在html5中设置的最大值和最小值
- x 轴刻度未正确递增,它被设置为最大值 y
- 哪种方式最适合为每个访问者创建一个公共变量
- 使用具有金钱掩码的字段设置动态最大值
- 使用$scope变量设置Datepicker最小/最大日期
- 如何将事件设置为最顶级的父React样式
- 将水平滚动条位置设置为最右侧
- 我们可以在Chrome应用程序的Outerbounds中设置的最大宽度是多少
- Chart.js,设置一个最大值
- Angular NVD3 y轴将最小数据值设置为最大范围值
- 哪种方式最适合在JavaScript中创建对象?在对象属性之前是否需要' var '
- 当值大于最大值时,如何在角量规图中将刻度盘设置为最大值
- 在Google图表API中设置硬最小轴值
- 有没有一种设置方式"!“重要”;用于event.stop()
- 如果未设置,请设置密钥 - 哪种方式最有效
- 无法为Highstock (Highcharts)设置xAxis最小值