javascript - 为什么 convertToFastObject 函数使其变快?

标签 javascript performance dart

在Dart SDK 1.0 发布后,我试用了一下,用Dart 写了一个简单的hello-world 程序。 然后,使用 SDK 工具,我生成了 JavaScript 文件:helloworld.dart.js 我查看了输出的 js 代码,看到有一个名为 convertToFastObject 的函数。 定义是:

function convertToFastObject(properties) {
    function MyClass() {};
    MyClass.prototype = properties;
    new MyClass();
    return properties;
}

使用代码如下:

A = convertToFastObject(A);
B = convertToFastObject(B);

我知道这段代码适用于各种浏览器,不仅仅适用于 Chromium/Chrome。 我不明白,为什么函数可以使对象更快?

最佳答案

这是针对 Google 的 V8 引擎的速度优化。

可以肯定的是,这个代码片段看起来很奇怪:它将 properties 分配为构造函数 MyClass 的原型(prototype),然后使用构造函数构建一个带有 的实例>new MyClass(),然后返回属性。这很奇怪,因为 1) properties 永远不会改变,并且 2) 函数永远不会再次使用 MyClass 或实例

每当您看到这样的奇怪行为时,您就可以相当确定这是一种速度优化。在这种情况下,速度是通过使用 V8 的 "hidden class" optimization 获得的。 .来自 closely-related section of the Dart source :

// Use the newly created object as prototype. In Chrome,
// this creates a hidden class for the object and makes
// sure it is fast to access.

在 V8 引擎中,构造的对象被赋予一个“隐藏的”C++ 类来表示其属性集。通过构造一个原型(prototype)为properties对象的对象,properties的属性值成为新实例的C++隐藏类的一部分,从而提高了属性访问速度。

我相信 V8 中的所有对象在默认情况下都有隐藏类,因此对这种技术的需求并不是很明显。然而,it is possible for an object to lose its hidden class (并进入“慢速模式”或“字典模式”)通过证明它不会从优化中受益。当一个对象删除它的一个属性或添加太多与任何其他对象的属性无关的属性时,V8 假定共享隐藏类没有值(value),因为该对象没有其他与之共享其隐藏类的相似对象。此 convertToFastObject 函数可以通过将“慢速模式”对象用作新构造实例的原型(prototype)来重新恢复“慢速模式”对象对隐藏类的权限。

相关隐藏类问题,由不同的 Dart 优化引起:What is this generated code supposed (intended) to do?

关于javascript - 为什么 convertToFastObject 函数使其变快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20098541/

相关文章:

javascript - 如何使用FormData进行AJAX文件上传?

javascript - 在jquery中同时滚动两个div

sql - Spark SQL查询与DataFrame函数

MYSQL (NOT IN) 查询很慢

flutter - 有一个适合上下文 flutter 大小的容器吗?

javascript - 使用 2 个按钮 + sweetalert2 提交表单

ios - 在 cellForItemAtIndexPath 中创建 NSMutableAttributedString 和 NSTextAttachment 是一个坏主意(性能或设计方面)?

android - 获取文件路径而不用 flutter 将文件加载到内存中?

flutter - 'String'不是'List <String>类型的子类型

javascript - 保存后主干网未使用 save() 发出 put 请求