首页 > 解决方案 > 为什么在 JavaScript 中访问 myInstance.property1.subproperty2.subproperty3 成本很高,但在 C++ 中却免费?

问题描述

我一直将其理解为 JavaScript 中的一种节省成本的操作,以避免重复引用对象上的嵌套属性。而不是a.b.c.d一遍又一遍地写,你会喜欢let x = a.b.c.d;然后使用x(我经常听到通俗地称为“缓存引用”。)

最近在与一位朋友的交谈中发现,这样的事情在 C++ 中是完全没有必要和愚蠢的。

真的吗?如果是这样,为什么?我想这与 C++ 对象和 JavaScript 对象之间的底层语言实现的差异有关,但究竟有什么区别呢?

标签: javascriptc++performance

解决方案


与 C++ 类相比,JavaScript 对象更接近 C++ std::map(或std::unordered_map)。

C++ 的优点是具有单独的编译和运行步骤。只要编译器喜欢分析程序的大块并对其进行大量优化,它就真的可以花很长时间。当您编写 C++ 时,您实际上并不是在编写供 CPU 执行的程序。您正在描述程序的行为,编译器将使用该描述为您提供程序。您的浏览器的 JavaScript 运行时(可能是 JIT 编译器)根本没有时间进行相同级别的分析和优化。它必须足够快地编译和运行您的程序,以使用户不会察觉到任何延迟。这并不是说 JavaScript 运行时不会做任何优化,

C++ 类的所有属性在编译时都是已知的。当您在 C++ 中访问对象的属性时,编译器将在编译时解析该访问;可能是少量的内存加载或单个函数调用指令。由于这一切都是在编译时解决的,因此属性查找嵌套的深度并不重要。运行时性能将是相同的。此外,编译器会为你做这种记忆,很可能通过将重复访问的属性保存在寄存器中。

JavaScript 并非如此。JavaScript 对象没有定义的属性集。它们可以在对象的整个生命周期中添加和删除。这意味着 JavaScript 运行时必须使用某种关联数据结构(可能是哈希表)来跟踪对象的属性。当您请求对象的属性时,运行时必须查看该数据结构以找到您想要的值,并且它必须对每个嵌套级别进行查找。


推荐阅读