javascript – V8引擎如何处理添加属性的排序?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – V8引擎如何处理添加属性的排序?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2660字,纯文字阅读大概需要4分钟。
内容图文
![javascript – V8引擎如何处理添加属性的排序?](/upload/InfoBanner/zyjiaocheng/772/eda36459b3c94f818ccfe50d2087beda.jpg)
我一直在关注Google的V8 Javascript引擎的性能改进,因为我想将它合并到我自己的一个项目中.
我现在感兴趣的是隐藏的课程.基本思想是V8创建隐藏类,因为属性被添加到对象中,以便有效地查找该属性,从而避免字典搜索.
例如,当您创建一个名为p的新Point对象时,它会创建一个隐藏类C0,它是一个没有属性的类,并将该类附加到该对象:
语句p.x = 0将修改对象以添加属性,然后创建一个新的类C1,指定可以在对象内的特定偏移处找到x属性.
因此,在此之后获得p.x是一个相对有效的操作.
最后,执行p.y = 0将执行类似的操作,最后得到:
现在这实际上相当漂亮,因为如果你创建另一个Point对象p2,不需要创建新的隐藏类,它只是被“分配”到C0.同样,在不必创建新的隐藏类方面,按顺序添加x和y属性也是有效的.
但是这个方案有两个潜在的问题.第一个涉及以下代码段发生的情况:
Point p3 = new Point();
p3.y = 3141592653589;
p3.x = 2718281828459;
在我看来,这将创建两个新的隐藏类,一个y在偏移零处,另一个y在偏移0处,x在偏移1处.
这似乎有点空间效率,因为两种情况下的最终类都有x和y,所以应该能够共享C2类,尽管需要在对象本身中交换x和y.
使转换映射更加受控制会产生什么影响,例如确保按字母顺序存储属性?这样,无论你添加x然后是y,还是y然后x,你仍然会在同一个最终类中结束.
这意味着在添加属性时会有一些额外的工作,但可以大大减少隐藏类的数量.
或者这项额外的工作本身可能会造成太大的性能损失?
第二个潜在的问题是,由于此方案的整个目的是避免对对象进行字典查找,因此如何移动:
For x, see offset 0
For y, see offset 1
进课帮忙?
在我看来,您仍然需要在隐藏类中查找属性名称以获取对象内的偏移量.
或者我错过了什么,并且不需要对该课程进行字典搜索?
解决方法:
优化后,不需要字典搜索(对于大多数访问).
在属性访问时,v8(希望)将属性访问转换为内联缓存存根.这意味着,在访问x时,它的标识x已被偏移值包含.所以它不再是真正的x面,或者甚至x偏移0,它只是偏移0.即使对象表示被称为“地图”,它实际上只是一个偏移表.这就是物业快速访问的原因.
当需要添加新属性时,问题不在于“当前对象具有所有属性的对象在哪里加上新属性?”它是“对于这个对象,我需要做些什么才能添加这个属性?”在此基础上选择过渡.在优化代码中,不考虑现有属性的名称.删除多余的隐藏类将需要一些相对较大的操作来找到匹配的映射.
您反对属性添加的假设会创建两个新的隐藏类.您可以通过使用d8 –allow-natives-syntax运行以下内容来获得一些信息:
function Point() {}
var p = new Point();
var px = new Point();
px.x = 0x10101;
var py = new Point();
py.y = 0x20202;
var pxy = new Point();
pxy.x = 0x30303;
pxy.y = 0x40404;
var pyx = new Point();
pyx.y = 0x50505;
pyx.x = 0x60606;
var newp = new Point();
checkmaps();
newp.x = 0x70707;
checkmaps();
newp.y = 0x80808;
checkmaps();
function checkmaps() {
var sameas = [];
if (%HaveSameMap(newp, p))
sameas.push("p");
if (%HaveSameMap(newp, px))
sameas.push("px");
if (%HaveSameMap(newp, py))
sameas.push("py");
if (%HaveSameMap(newp, pxy))
sameas.push("pxy");
if (%HaveSameMap(newp, pyx))
sameas.push("pyx");
print(sameas);
}
输出是:
p
px
pxy
内容总结
以上是互联网集市为您收集整理的javascript – V8引擎如何处理添加属性的排序?全部内容,希望文章能够帮你解决javascript – V8引擎如何处理添加属性的排序?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。