声明变量以访问 for 循环中对象的嵌套属性是否更好?

Is it better to declare variables to access nested properties of objects in for loops?

提问人:Premchand K 提问时间:6/15/2023 最后编辑:Premchand K 更新时间:11/11/2023 访问量:89

问:

// for example I have an object like this
const requestBody = [
    {
        a: 1,
        b: 2,
        c: {
            d: {
                e: 3,
                f: 4,
                g: {
                       h: {
                           i: 5,
                           j: {
                              k: 6
                           }
                       }
                   }
            }
        }
    }
]
// in for loop
for (let i = 0; i < requestBody.length; i++) {
     const g = requestBody[i].c.d.g;
     // do something related to g
     const k = g.h.j;
     // do something related to k
}

所以,我在这里想知道的是根据性能,声明变量并存储嵌套属性,然后通过变量在循环中访问更好吗?还是直接访问对象的嵌套属性(如 requestBody[i].c.d.g)并执行与 g 相关操作更好?

JavaScript 节点 .js 性能 for 循环 变量

评论

1赞 Premchand K 6/15/2023
@JaromandaX 您能告诉我哪种方式更适合数百万件物品吗?虽然我们没有处理数百万件物品,但我只是想知道。
0赞 Premchand K 6/15/2023
@JaromandaX 得到你的积分,谢谢
1赞 jfriend00 6/15/2023
这称为过早的性能优化。只有当存在已知的、非常具体的和优先的性能问题时,才应该研究和回答这些问题。然后,您可以在所有相关环境中对可能的解决方案进行基准测试,并决定使用哪种解决方案。在具有多个运行时实现的解释型语言中,对于这样的问题没有通用的答案。而且,做任何使代码复杂化的事情都是不合适的,除非你有一个经过验证的性能问题,证明对不同的可能解决方案进行基准测试是合理的。
0赞 jfriend00 6/15/2023
而且,对于特定的 JS 引擎来说,这样的答案甚至会随着时间的推移而改变,因为 JS 引擎添加了不同的优化。事实上,对于可以实现的循环优化类型,使用临时变量弄乱循环内的东西有时甚至会破坏优化路径。
0赞 Premchand K 6/15/2023
@jfriend00知道了,谢谢

答:

1赞 Thakar Sahil 6/15/2023 #1

嵌套属性以访问可变元素的方式,完全基于您的实际用例。

因为在 JSON 文件中,我们只这样做,但它完全基于您的要求和数据。你不能每次都做嵌套,很多时候你必须优化它才能访问单个元素。

因此,请尝试用真实的用例和真实的数据来思考这个问题,然后只有您才能找到答案。

否则,完全没问题。但是使用循环并访问元素可能不是正确的方法,一个接一个地访问这些元素的最佳方法是通过序列化和反序列化。

这只是我根据经验的想法,其他人可以发表意见。

0赞 Rita Mwaikinda 11/11/2023 #2

就时间性能而言,通常最好在循环之外声明和缓存变量,尤其是在要多次访问嵌套属性值时。

Nicholas Zakas 在 O'Reilly 的著作《High Performance JavaScript》的第 2 章和第 3 章中对此进行了更深入的讨论,其中他讨论了“访问成员”

您还可以在此处运行测试,以查看对象属性深度变化时数据访问的性能: https://humanwhocodes.com/experiments/javascript/performance/data-access.html

在后台,Javascript 对象是一个关联数组,每个执行 JS 的引擎都有自己的访问对象属性的方式。例如,V8 引擎使用映射和隐藏类。它们都必须遵守ECMA标准,因此这些方面的性能问题不在于构建引擎的开发人员,而在于引擎。但是,如果我们以上面的示例为例,如果路径中的这些属性中只有一个是 getter,那么该属性右侧的所有内容都必须重新收集。您会发现,在后台,大多数浏览器都会缓存返回的对象值,以便将来轻松访问。

您可以在此处找到有关 JavaScript 及其如何处理属性的更多信息:https://v8.dev/blog/fast-properties

评论

1赞 Rita Mwaikinda 11/11/2023
虽然这个问题是关于对象的,但我想补充一点,这主要适用于数组属性,但并非总是如此 - Firefox 实际上已经做了一些非常了不起的事情来优化数组索引,这实际上使它们对数组项的性能比对变量的性能更好!相当令人印象深刻。但是,这不是常态,您在使用其他浏览器和设备时将面临的限制通常意味着您仍然应该坚持使用文字和变量以优化性能。但我只想分享一个场景。