为什么convertToFastObject函数会使它快速?

时间:2013-11-20 14:26:28

标签: javascript performance dart

我在1.0版本之后尝试了Dart SDK,并在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。 我无法理解,为什么函数可以使对象更快?

2 个答案:

答案 0 :(得分:10)

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

可以肯定的是,此代码段看起来很奇怪:它将properties指定为构造函数MyClass的原型,然后使用构造函数构建具有new MyClass()的实例,然后返回properties。这很奇怪,因为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 ++类来表示其属性集。通过构造一个原型为properties对象的对象,properties的属性值成为新实例的C ++隐藏类的一部分,从而提高了属性访问速度。

我相信V8中的所有对象默认都有隐藏类,所以对这种技术的需求并不是很明显。但是,it is possible for an object to lose its hidden class(并进入“慢速模式”或“字典模式”)通过证明它不会从优化中受益。当对象delete的某个属性或添加了太多与其他对象的属性无关的属性时,V8假定共享的隐藏类没有价值,因为该对象没有其他类似的对象分享它的隐藏课程。这个convertToFastObject函数可以通过将它作为新构造实例的原型来重新设置“慢模式”对象对隐藏类的权限。

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

答案 1 :(得分:-1)

数据存储在脚本中的位置直接导致执行所需的时间。通常,脚本中有四个可以访问数据的位置:
- 价值
-Variable
- 阵列项目
- 对象属性

读取数据总是会产生性能成本,而且成本取决于数据存储在这四个位置中的哪一个。如果使用“Object.Prototype”创建属性,则此处的范围为“Object.Prototype”它小于对象的范围“对象”。另外还有当地的变量和不可枚举的东西。这就是为什么使用Prototype创建礼节可以更快地访问!阅读这两篇文章以获得更好的理解: 1- http://oreilly.com/server-administration/excerpts/even-faster-websites/writing-efficient-javascript.html 2 - http://www.packtpub.com/article/using-prototype-property-in-javascript