【发布时间】:2019-08-02 17:32:45
【问题描述】:
从此old article 阅读 V8(微)优化 并且有一个引用:
始终以相同的顺序初始化对象成员
问题:在下面的示例中,始终以相同的顺序初始化对象成员是什么意思?
function Point(x, y) {
this.x = x; // this.x = x line first because x is the first arg
this.y = y; // this.y = y line second because y is the second arg
}
var p1 = new Point(11, 22);
var p2 = new Point(33, 44);
// At this point, p1 and p2 have a shared hidden class
p2.z = 55;
// warning! p1 and p2 now have different hidden classes!
加长引号:
JavaScript 具有有限的编译时类型信息:类型可以在运行时更改,因此很自然地期望在编译时推理 JS 类型的成本很高。这可能会导致您质疑 JavaScript 性能如何能够接近 C++。但是,V8 在运行时为对象内部创建了隐藏类型;具有相同隐藏类的对象可以使用相同的优化生成代码。
在对象实例 p2 添加了额外的成员“.z”之前,p1 和 p2 在内部具有相同的隐藏类 - 因此 V8 可以为操作 p1 或 p2 的 JavaScript 代码生成单一版本的优化程序集。您越能避免导致隐藏类发散,您将获得更好的性能。
因此:
在构造函数中初始化所有对象成员(这样实例以后就不会改变类型)
始终以相同的顺序初始化对象成员
注意:我在 C++ 中发现了类似的问题,但我真的看不懂Why should I initialize member variables in the order they're declared in?
【问题讨论】:
-
例如,如果您的构造函数有分支逻辑导致
x和y根据输入参数以不同的顺序初始化,那将违反您引用的建议。 -
你能创建一个答案+例子吗...我还是不明白。
标签: javascript optimization v8