- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
在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/
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!