ES6 JavaScript - const内部还是外部循环?

时间:2018-06-12 01:10:23

标签: javascript performance loops const let

出于性能目的,我想知道ES6 JavaScript之间的区别:

var list = [...];
let item; //let outside the loop
for (let i = 0; i < list.length; i++) {
    item = list[i];
}

var list = [...];
for (let i = 0; i < list.length; i++) {
    const item = list[i]; //const inside the loop
}

假设item变量旨在在循环内保持不变。

有人推荐吗?每个人的表现有哪些优缺点? GC是否以不同方式处理它们?

请注意,这是微优化。此外,性能对于所使用的JS引擎是主观的..(见答案)

3 个答案:

答案 0 :(得分:3)

考虑到不同的浏览器内部实现方式截然不同,很难给出明确的答案。很可能零差异。在执行之前,浏览器中的Javascript是由内部JIT编译器编译的,它很可能会识别循环内的冗余变量声明并将其优化出来,就像任何其他好的编译器一样。 letconst肯定会对此产生影响,我认为const会更有可能在循环中进行优化,因为编译器可以立即看到它是一个特定于内循环范围的不可变原子变量。 它也可能会展开性能密集型循环。 Javascript还有一些其他的性能怪癖,但是在较高范围内访问变量会导致轻微的性能损失,我记得很久以前在浏览器中执行gamdev的时候。那可能不再是现在了,但几年前就是这样。

正如其他人所指出的,除非分析已经表明这是您应用程序中的严重瓶颈,否则过早优化。如果优化它可能会带来任何显着的性能优势,我会感到非常震惊。如果这方面的表现很重要,最好的建议是自己描述不同的场景,并决定什么是最适合您的用例。

答案 1 :(得分:0)

在第一个示例中,item的作用域在循环外部,因此分配的最终值将在任何封闭范围内可用。在后一个示例中,循环关闭后item未定义。您也无法在循环中重新分配item,因为它是const而不是let

就个人而言,我会使用第二种,除非有理由使用第一种。由于需要额外的变量分配,第二个示例的性能差异很小,但略微更差。

答案 2 :(得分:0)

免责声明:我现在认为以下是猜想,并且会犹豫是否应该选择它作为答案,直到可以确认。在此之前,我会在此留待评论和确认;如果发现不正确,将被删除。

有两件事需要考虑:

  1. let vs const
  2. 循环中的变量声明
  3. 两者都将依赖于浏览器的实现,因此性能并非一成不变;但是,通常第一个(在循环外声明let)应该产生更有效的结果,因为声明变量通常比单独赋值更多OPS。

    重要的是要注意结果的效率将受到几个因素的影响。这些包括但不限于:

    • 用于执行代码的系统资源
    • 执行的操作类型(如果与初始示例不同)
    • 列表的长度及其值的大小

    虽然很难确定代码的效率会有多高,但重要的是要注意平均条件(平均多核桌面w /至少2GB的RAM)和平均大小的列表(例如,5k元素),结果的差异将是纳秒到微秒,并且考虑到这种差异通常被认为是微观优化。