Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

delete操作对v8隐藏类的影响

  之前的文章中介绍了使用修改对象[[prototype]]的方式来规避隐藏类堆叠的问题,虽然可以解决问题,但它无故让对象多出一层原型链,显然不是个好方法。dart2js中也解决了这个问题,它巧妙的使用了delete操作对隐藏类的影响来解决的,这很值得学习。
  在v8中,delete除了我么熟知的删除属性功能外,对隐藏类也有一定的影响。当使用delete在对象上删除掉其拥有的属性时,这个对象会脱离原有的隐藏类继承链并进入字典模式。下面我们还是用之前文章的测试例子,只是把优化的部分改成了delete的方式。
<input type="button" value="常规" />
<input type="button" value="优化" />
<script>
document.onclick=function(e){
  if(!(e=e.target.value))return;
  var i,o;
  console.time(e);
  for(i=0;i<1E4;i++){
    o={};
    if(e=="优化")o._=null,delete o._;
    o["n"+i]=i;
  };
  console.timeEnd(e);
};
</script>

  当我们认为一个对象不需要IC优化时就可以这么做。但要注意这只针对不需要IC优化的对象。换一个角度就能看出,对于依赖IC优化的对象我们就应该避免对它做delete操作。否则同样影响性能,例如下面这个测试: <input type="button" value="常规" />
<input type="button" value="作死" />
<script>
document.onclick=function(e){
  if(!(e=e.target.value))return;
  var i,o={};
  if(e=="作死")o._=null,delete o._;
  console.time(e);
  for(i=0;i<1E7;i++)
    o.a=o.b=o.c=o.d=o.e=o.f=o.g=o.h=o.i=
    o.j=o.k=o.l=o.m=o.n=o.o=o.p=o.q=o.r=
    o.s=o.t=o.u=o.v=o.w=o.x=o.y=o.z=i;
  console.timeEnd(e);
};
</script>


  测试于:Chrome 31.0.1650.63 m
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^