Web 技术研究所

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

退出v8数组的字典模式

  很多操作都会使v8的数组进入字典模式,但是我们通常希望数组始终在快速模式下工作,所以我们需要想办法退出字典模式。之前对于v8上shift方法破坏属性配置的BUG就已经做过描述,实际上解决办法就是以毒攻毒,利用这个BUG的特性来退出数组的字典模式。
  v8为了实现数组元素的快速移动,直接从数据层上操作数据。或者说,v8对破坏性的数组操作使用重建数组的方式,但不改变原来的数组句柄。因此,被重建的数组就不受原来字典模式的元素,重新初始化了快速模式。于是有
<input type="button" value="常规" />
<input type="button" value="优化" />
<script>
document.onclick=function(e){
  var i,a,b,n=e.target.value;
  if(!n)return;
  //两种方式初始化字典模式数组
  a=[],a[1024]=null;
  Object.defineProperty(b=[],0,{configurable:true});
  //如果是测试优化版就把数组都转换成快速模式
  if(n=="优化")
    a.unshift(null),a.shift(),
    b.unshift(null),b.shift();
  //访问数组元素测试效率
  console.time(n+" a");
  for(i=0;i<1E6;i++)a[0]=i;
  console.timeEnd(n+" a");
  console.time(n+" b");
  for(i=0;i<1E6;i++)b[0]=i;
  console.timeEnd(n+" b");
};
</script>

  这样即可对以上两种情况做优化,但对于数组元素超出kInitialMaxFastElementArray的数组就无法优化。因为重建数组依然需要考虑数组初始元素的数量。虽然要对其优化也不是不可以,但可能得不偿失。所以对于元素数量巨大的数组我建议使用分段多维存储。

  测试于:Chrome 31.0.1650.57 m

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