gpt4 book ai didi

javascript - 在 JavaScript 对象字面量中保持对象结构一致是否有助于提高性能?

转载 作者:行者123 更新时间:2023-12-05 04:21:12 26 4
gpt4 key购买 nike

例如,有些对象具有相似的结构但不完全相同。

const arr = [
{ name: 'john', age: 12 },
{ name: 'marry', age: 24, married: true }
]

const obj = {
john: { age: 12 },
marry: { age: 24, married: true }
}

假设 John 没有结婚,所以他不需要 married 键。 (尽管为了一致性,将“已婚”设为 false 可能更好。)这可能不是一个完美的示例,但在任何一种情况下都包括 married 键并保持对象结构一致有助于提高性能机会?例如也许它可以帮助 CPU 更快地将数据写入内存...?

最佳答案

抛开标准免责声明(这里所说的一切可能因引擎而异,甚至同一引擎的不同版本之间也有所不同,这只是一个实现细节,在优化之前进行测量,在优化之前三思而后行,以牺牲可读性为代价,blah blah blah ... ),我认为用谨慎的"is"来回答这个问题是合理的。至少,确保对象始终具有相同的形状应该有害

特别是在 V8 的情况下,有一些众所周知的 hidden class optimization ,它根据动态配置的内容优化对象的内存布局。运行时对象形状越少,要跟踪的隐藏类就越少,并且可以在更多情况下重用那些隐藏类。引擎也不必为多个隐藏类查找缓存数据,这可以减少 CPU 缓存争用。

构成物体“形状”的因素当然会有所不同,但您可以预期有许多相关的特征:

  • 存在哪些属性;
  • 将属性添加到对象的顺序(对此的敏感性有时称为路径依赖);
  • 构造后是否修改属性;
  • 这些属性中值的类型,甚至是这些类型的特定子范围(例如,已知 V8 存储 [−231 范围内的整数) , 231) 比其他数字更有效,即使 JS 数字类型名义上涵盖所有 IEEE 754 double )。

虽然以上内容主要基于 V8,但您可以预期任何其他优化 JavaScript 引擎都会根据对象形状执行大致相似的优化。事实上,即使是相对简单的 QuickJS 也会缓存对象形状以加速属性查找。

并以确保概念上相同“类型”的对象具有一致形状的方式编写代码(例如,通过让它们始终在代码中的单个位置构建,其中相同的属性以相同的顺序添加) 很多时候甚至不应该损害可读性——相反,它甚至可能使代码更容易理解。与其他一些微优化不同,我认为这至少在某种程度上绝对值得做。

关于javascript - 在 JavaScript 对象字面量中保持对象结构一致是否有助于提高性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74291337/

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