首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >v8性能指南

v8性能指南
EN

Stack Overflow用户
提问于 2014-06-15 20:27:54
回答 1查看 204关注 0票数 1

我倾向于使用工厂方法在javascript中构造没有this关键字的对象。例如:

代码语言:javascript
运行
复制
var PointA = function(x, y) {
  var z = {};
  z.x = x;
  z.y = y;
  return z;
};
var z0 = PointA(1, 2);

我看到了几个示例,演示了v8如何使用隐藏类实现快速属性查找,但所有这些示例都使用了对象构造的标准技术,即:

代码语言:javascript
运行
复制
var PointB = function(x, y) {
  this.x = x;
  this.y = y;
};
var z0 = new PointB(1, 2);

如果我使用像PointA这样的非传统工厂,那么我是否妨碍了v8的隐藏类优化器?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-16 12:17:27

JavaScript中的所有V8对象都使用隐藏类机制,所以不管是通过构造函数创建对象还是从文字创建对象--两者都有隐藏类。

然而,重要的是隐藏类是如何相互连接的。隐藏类正在形成转换树,根连接到构造函数上。如果要从文字中创建对象,这意味着您的转换树本质上是从Object构造函数中增长的。这有时会混淆V8,因为逻辑上断开连接的转换树似乎在根上连接到V8。看看 jsPerf微基准测试。我创建了两个看似断开连接的对象:

代码语言:javascript
运行
复制
function X() {
  var self = {};
  self.x = 0.1;
  return self;
}

function Y() {
  var self = {};
  self.x = true;
  return self;
}

var y = new Y, x = new X;

然而,在内部,V8无法为X生成的对象上的属性x选择最有效的表示形式,因为它也将Y生成的对象视为同一隐藏类转换树的一部分。如果通过构造函数创建对象,该构造函数启动新的转换树并得到结果,则不存在类型混淆。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24233820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档