在时间优化方面,最好在循环内部或外部声明JavaScript对象

在时间优化方面,最好在循环内部或外部声明JavaScript对象,javascript,arrays,optimization,variable-declaration,Javascript,Arrays,Optimization,Variable Declaration,编辑:这个问题主要集中在每次迭代中对象是在for循环内声明(十亿个数量级的巨大循环)还是在for循环外声明一次对象以节省每次sprint中对象声明期间的时间(内存分配所花费的时间)更好 我试图通过确保在每次迭代中不会花费额外的时间为for循环中声明的对象分配内存来优化代码 我有一个long-for循环(比如十亿次),它在每次数组迭代中创建巨大的对象,并将这些对象推送到数组中。我的问题是,在for循环中声明对象还是在外部声明对象更好,这样JavaScript运行时就不必在每个sprint中为对象分

编辑:这个问题主要集中在每次迭代中对象是在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新手,但我尽了最大努力将我所有的分析和示例代码放在我的问题中,以解释我的问题。如果我知道这里缺少什么,我将不胜感激,这样我可以把它作为未来的输入。谢谢