javascript - 为什么在 JavaScript 中访问 myInstance.property1.subproperty2.subproperty3 成本很高,但在 C++ 中却免费?
问题描述
我一直将其理解为 JavaScript 中的一种节省成本的操作,以避免重复引用对象上的嵌套属性。而不是a.b.c.d
一遍又一遍地写,你会喜欢let x = a.b.c.d;
然后使用x
(我经常听到通俗地称为“缓存引用”。)
最近在与一位朋友的交谈中发现,这样的事情在 C++ 中是完全没有必要和愚蠢的。
真的吗?如果是这样,为什么?我想这与 C++ 对象和 JavaScript 对象之间的底层语言实现的差异有关,但究竟有什么区别呢?
解决方案
与 C++ 类相比,JavaScript 对象更接近 C++ std::map
(或std::unordered_map
)。
C++ 的优点是具有单独的编译和运行步骤。只要编译器喜欢分析程序的大块并对其进行大量优化,它就真的可以花很长时间。当您编写 C++ 时,您实际上并不是在编写供 CPU 执行的程序。您正在描述程序的行为,编译器将使用该描述为您提供程序。您的浏览器的 JavaScript 运行时(可能是 JIT 编译器)根本没有时间进行相同级别的分析和优化。它必须足够快地编译和运行您的程序,以使用户不会察觉到任何延迟。这并不是说 JavaScript 运行时不会做任何优化,
C++ 类的所有属性在编译时都是已知的。当您在 C++ 中访问对象的属性时,编译器将在编译时解析该访问;可能是少量的内存加载或单个函数调用指令。由于这一切都是在编译时解决的,因此属性查找嵌套的深度并不重要。运行时性能将是相同的。此外,编译器会为你做这种记忆,很可能通过将重复访问的属性保存在寄存器中。
JavaScript 并非如此。JavaScript 对象没有定义的属性集。它们可以在对象的整个生命周期中添加和删除。这意味着 JavaScript 运行时必须使用某种关联数据结构(可能是哈希表)来跟踪对象的属性。当您请求对象的属性时,运行时必须查看该数据结构以找到您想要的值,并且它必须对每个嵌套级别进行查找。
推荐阅读
- c - 我该如何纠正这种内存泄漏?
- c++ - 将 sprintf 更改为字符数组 C++
- python - Django / Visual Studio 类没有对象错误
- python - 在 Python 中返回占位符
- arrays - 指向数组 int (*ptr)[] 的指针
- c# - 来自 grpc AsyncServerStreamingCall 的高 CPU 使用率
- android-jetpack-compose - 在 DrawScope 中绘制文本 - Jetpack Compose Desktop
- node.js - Express 应用程序中的随机 socket.io 请求
- android - 自定义列表视图未出现在对话框中
- django - 尽管创建了独特的 slug 函数,但 blog_post.slog 上的 IntegrityError UNIQUE