在时间优化方面,最好在循环内部或外部声明JavaScript对象
编辑:这个问题主要集中在每次迭代中对象是在for循环内声明(十亿个数量级的巨大循环)还是在for循环外声明一次对象以节省每次sprint中对象声明期间的时间(内存分配所花费的时间)更好 我试图通过确保在每次迭代中不会花费额外的时间为for循环中声明的对象分配内存来优化代码 我有一个long-for循环(比如十亿次),它在每次数组迭代中创建巨大的对象,并将这些对象推送到数组中。我的问题是,在for循环中声明对象还是在外部声明对象更好,这样JavaScript运行时就不必在每个sprint中为对象分配内存 这是我尝试过的一个百万计数的循环。尝试了十亿次计数,但在我的计算机上没有完成:在时间优化方面,最好在循环内部或外部声明JavaScript对象,javascript,arrays,optimization,variable-declaration,Javascript,Arrays,Optimization,Variable Declaration,编辑:这个问题主要集中在每次迭代中对象是在for循环内声明(十亿个数量级的巨大循环)还是在for循环外声明一次对象以节省每次sprint中对象声明期间的时间(内存分配所花费的时间)更好 我试图通过确保在每次迭代中不会花费额外的时间为for循环中声明的对象分配内存来优化代码 我有一个long-for循环(比如十亿次),它在每次数组迭代中创建巨大的对象,并将这些对象推送到数组中。我的问题是,在for循环中声明对象还是在外部声明对象更好,这样JavaScript运行时就不必在每个sprint中为对象分
//Case 1: Object declared outside the for loop
function createObjInForLoopWithVarDeclaredOutside() {
var startTime = Date.now();
var obj; //object declared here so that memory allocation is done one time
var targetArray = [];
for(var i = 0; i < 1000000; i++) {
obj = {};
obj.id = i;
obj.value = 'value :: ' + i;
targetArray.push(obj);
}
var endTime = Date.now();
var timeTaken = endTime - startTime;
console.log('Time taken: ' + timeTaken);
}
//案例1:在for循环外部声明的对象
函数createObjInForLoopWithVarDeclaredOutside()的{
var startTime=Date.now();
var obj;//此处声明的对象,以便一次性完成内存分配
var targetArray=[];
对于(变量i=0;i<1000000;i++){
obj={};
obj.id=i;
obj.value='值::'+i;
目标推力(obj);
}
var endTime=Date.now();
var timetake=结束时间-开始时间;
console.log('花费的时间:'+花费的时间);
}
上述程序所用时间:505至525毫秒
//Case 2: Object declared and defined inside for loop for each sprint
function createObjInForLoopWithVarDeclaredInside() {
var startTime = Date.now();
var targetArray = [];
for(var i = 0; i < 1000000; i++) {
var obj = {};
obj.id = i;
obj.value = 'value :: ' + i;
targetArray.push(obj);
}
var endTime = Date.now();
var timeTaken = endTime - startTime;
console.log('Time taken: ' + timeTaken); //486 to 509
}
//案例2:在for循环中为每个sprint声明和定义对象
函数createObjInForLoopWithVarDeclaredInside()的作用{
var startTime=Date.now();
var targetArray=[];
对于(变量i=0;i<1000000;i++){
var obj={};
obj.id=i;
obj.value='值::'+i;
目标推力(obj);
}
var endTime=Date.now();
var timetake=结束时间-开始时间;
log('Time taked:'+timetaked);//486到509
}
上述程序所用时间:486至509毫秒
//Case 2: Object declared and defined inside for loop for each sprint
function createObjInForLoopWithVarDeclaredInside() {
var startTime = Date.now();
var targetArray = [];
for(var i = 0; i < 1000000; i++) {
var obj = {};
obj.id = i;
obj.value = 'value :: ' + i;
targetArray.push(obj);
}
var endTime = Date.now();
var timeTaken = endTime - startTime;
console.log('Time taken: ' + timeTaken); //486 to 509
}
有人能解释一下哪种方法更好地优化执行时间吗?对于在for循环中声明对象的第二种方法,我担心这可能需要更长的时间来运行,因为每次迭代,运行时都必须为新对象分配内存,这可能需要更长的时间。然而,对于我的分析数据,第二种在for循环中声明对象的方法似乎更好。在范围界定方面,我个人最喜欢的是在需要时重新定义变量,但对于如此巨大的for循环,我确实想看看各种运行时优化
如果JavaScript在运行代码之前对代码进行了优化,我不确定是否需要进行这种优化。这些都是完全相同的。JS中的变量声明被提升到周围函数范围的顶部 对象的实际分配将是昂贵的部分,您必须在每次迭代中都这样做
在最坏的情况下,声明变量会在函数堆栈上放置一个引用。不管你怎么做,这都是很便宜的,但是由于JS强制提升,唯一可能不止一次的方法就是将对象创建拆分成另一个函数。如果这样做,在10亿次迭代中,调用开销本身会降低性能。两者都是相同的
for
循环不会创建新的作用域,因此变量被提升到包含函数作用域的顶部
例:
>i
未定义
>对于(var i=0;i<5;i++){var test=i;}
未定义
>我
5.
>试验
4.
如您所见,变量
i
和test
被提升到全局范围。您可能需要查看以更好地了解。谢谢您的回复!我没有想到变量提升来自Java背景。另外,因为for循环没有创建新的作用域,所以这两个函数的作用域相同是有意义的。谢谢Jason的回复!这有助于理解起重和范围的概念。顺便问一下,你文章中的代码格式是什么?看起来您是在试图解释提升,如果您在代码段中添加一些注释,这将更有帮助。@PrabhashRathore,该格式只是浏览器控制台或节点REPL的输出。我很高兴这有助于您的理解和愉快的编码!我想谦虚地问一下,为什么这个问题被否决?我是Stackoverflow新手,但我尽了最大努力将我所有的分析和示例代码放在我的问题中,以解释我的问题。如果我知道这里缺少什么,我将不胜感激,这样我可以把它作为未来的输入。谢谢