就时间优化而言,最好在 for 循环内部或外部声明 JavaScript 对象
Better to declare JavaScript Object inside for loop or outside in terms of time optimization
编辑:这个问题主要集中在每次迭代中是否应该在 for 循环(十亿级的巨大循环)内声明对象,还是最好在 for 循环外声明一次对象以节省时间每个 sprint 中的对象声明(花在内存分配上的时间)。
我正在尝试优化我的代码,以确保在每次迭代中我不会花费任何额外的时间为在 for 循环内声明的对象分配内存。
我有一个很长的 for 循环(比如十亿级),它在每次数组迭代中创建巨大的对象并将这些对象推送到数组中。我的问题是,是在for循环内声明对象还是在for循环外声明它更好,这样JavaScript 运行time就不必在每个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);
}
上述程序耗时: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
}
上述程序耗时:486 到 509 毫秒
有人可以帮助解释哪种方法可以更好地优化执行时间吗?使用第二种方法,我在 for 循环内声明对象,我担心的是 运行 可能需要更长的时间,因为每次迭代,运行time 都必须为新对象分配内存,这可能需要更长的时间。然而,根据我的分析数据,似乎第二种在 for 循环内声明对象的方法更好。在范围界定方面,我个人最喜欢的是在需要时对变量进行 decalre,但对于如此庞大的 for 循环,我确实想看看各种 运行 时间优化。
如果 JavaScript 在 运行 优化代码之前,我不确定是否需要这种优化。
完全一样。 JS 中的变量声明被提升到周围函数范围的顶部。
对象的实际分配将是最昂贵的部分,您必须在每次迭代时都这样做。
声明变量,在最坏的情况下,会在函数堆栈上放置一个引用。不管你怎么做,这都很便宜,但由于 JS 强制提升,你可能不止一次这样做的唯一方法是将对象创建拆分为另一个函数。如果你这样做,在十亿次迭代中,调用开销本身就会降低性能。
两者是一样的。 for
循环不创建新作用域,因此变量被提升到包含函数作用域的顶部。
例如:
> i
undefined
> for (var i = 0; i < 5; i++) { var test = i; }
undefined
> i
5
> test
4
如你所见,变量i
和test
在这里被提升到全局范围。您可能想查看 You Don't Know JS: Scopes & Closures 以获得更好的理解。
编辑:这个问题主要集中在每次迭代中是否应该在 for 循环(十亿级的巨大循环)内声明对象,还是最好在 for 循环外声明一次对象以节省时间每个 sprint 中的对象声明(花在内存分配上的时间)。
我正在尝试优化我的代码,以确保在每次迭代中我不会花费任何额外的时间为在 for 循环内声明的对象分配内存。
我有一个很长的 for 循环(比如十亿级),它在每次数组迭代中创建巨大的对象并将这些对象推送到数组中。我的问题是,是在for循环内声明对象还是在for循环外声明它更好,这样JavaScript 运行time就不必在每个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);
}
上述程序耗时: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
}
上述程序耗时:486 到 509 毫秒
有人可以帮助解释哪种方法可以更好地优化执行时间吗?使用第二种方法,我在 for 循环内声明对象,我担心的是 运行 可能需要更长的时间,因为每次迭代,运行time 都必须为新对象分配内存,这可能需要更长的时间。然而,根据我的分析数据,似乎第二种在 for 循环内声明对象的方法更好。在范围界定方面,我个人最喜欢的是在需要时对变量进行 decalre,但对于如此庞大的 for 循环,我确实想看看各种 运行 时间优化。
如果 JavaScript 在 运行 优化代码之前,我不确定是否需要这种优化。
完全一样。 JS 中的变量声明被提升到周围函数范围的顶部。
对象的实际分配将是最昂贵的部分,您必须在每次迭代时都这样做。
声明变量,在最坏的情况下,会在函数堆栈上放置一个引用。不管你怎么做,这都很便宜,但由于 JS 强制提升,你可能不止一次这样做的唯一方法是将对象创建拆分为另一个函数。如果你这样做,在十亿次迭代中,调用开销本身就会降低性能。
两者是一样的。 for
循环不创建新作用域,因此变量被提升到包含函数作用域的顶部。
例如:
> i
undefined
> for (var i = 0; i < 5; i++) { var test = i; }
undefined
> i
5
> test
4
如你所见,变量i
和test
在这里被提升到全局范围。您可能想查看 You Don't Know JS: Scopes & Closures 以获得更好的理解。