min*_*jun 7 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;
}
Run Code Online (Sandbox Code Playgroud)
使用代码如下:
A = convertToFastObject(A);
B = convertToFastObject(B);
Run Code Online (Sandbox Code Playgroud)
我知道这段代码适用于各种浏览器,不适用于Chromium/Chrome.我无法理解,为什么该函数可以使对象更快?
aps*_*ers 10
这是谷歌V8引擎的速度优化.
可以肯定的是,这段代码看起来很奇怪:它指定properties为构造函数的原型MyClass,然后使用构造函数构建一个实例new MyClass(),然后返回properties.这很奇怪,因为1)properties永远不会改变,2)函数永远不会再使用MyClass或实例.
每当你看到这样的奇怪行为时,你可以相当确定它是速度优化.在这种情况下,通过使用V8的"隐藏类"优化来获得速度.来自Dart来源的一个密切相关的部分:
// 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.
Run Code Online (Sandbox Code Playgroud)
在V8引擎中,构造对象被赋予"隐藏"C++类来表示其属性集.通过构造一个原型为properties对象的对象,属性值properties成为新实例的C++隐藏类的一部分,从而提高了属性访问速度.
我相信V8中的所有对象默认都有隐藏类,所以对这种技术的需求并不是很明显.但是,对象可能通过证明它不会从优化中受益而丢失其隐藏类(并进入"慢速模式"或"字典模式").当一个对象delete的某个属性或者添加了太多与任何其他对象的属性无关的属性时,V8假定共享的隐藏类没有价值,因为该对象没有其他类似的对象来共享其隐藏的类.该convertToFastObject函数可以将"慢模式"对象的权利重新设置为隐藏类,将其用作新构造实例的原型.
相关的隐藏类问题,来自不同的Dart优化:这个生成的代码应该是什么(打算)做什么?
| 归档时间: |
|
| 查看次数: |
226 次 |
| 最近记录: |