gpt4 book ai didi

javascript - 就时间优化而言,最好在 for 循环内部或外部声明 JavaScript 对象

转载 作者:行者123 更新时间:2023-12-02 16:06:46 25 4
gpt4 key购买 nike

编辑:这个问题主要集中在每次迭代中是否应该在 for 循环(十亿级的巨大循环)内声明对象,或者是否最好在 for 循环之外声明一次对象以节省对象声明期间的时间每个冲刺中(内存分配所花费的时间)。

我正在尝试优化我的代码,确保我不会花费任何额外的时间为每次迭代中 for 循环内声明的对象分配内存。

我有一个很长的 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);

}

上述程序花费的时间: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 循环内声明对象的第二种方法,我担心这可能需要更长的时间来运行,因为每次迭代、运行时都必须为新对象分配内存,这可能需要更长的时间。然而,根据我的分析数据,在 for 循环内声明对象的第二种方法似乎更好。在范围界定方面,我个人最喜欢的是在需要时对变量进行 decalre,但对于如此巨大的 for 循环,我确实想看看各种运行时优化。

我不确定是否需要这种优化,以防 JavaScript 在运行代码之前对其进行优化。

最佳答案

两者是相同的。 for 循环不会创建新的作用域,因此变量会被提升到包含函数作用域的顶部。

例如:

> i
undefined
> for (var i = 0; i < 5; i++) { var test = i; }
undefined
> i
5
> test
4

正如您所看到的,变量itest在这里被提升到全局范围。您可能想查看You Don't Know JS: Scopes & Closures以获得更好的理解。

关于javascript - 就时间优化而言,最好在 for 循环内部或外部声明 JavaScript 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30648566/

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