Web 技术研究所

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

v8的kMaxGap对数组性能的影响

  kMaxGap是v8中的一个常量,目前版本它的值是1024。快速模式的数组在添加新元素时会判断新添加的元素下标是否相对于数组原有的数据过于稀疏了。如果稀疏的部分在kMaxGap的限制之内则为稀疏的部分分配内存空间,否则为了防止内存浪费会把数组被转换成字典模式。
  下面这个测试就可以说明问题,请在Chrome上测试 <input type="button" value="test1" />
<input type="button" value="test2" />
<script>
const kMaxGap=1024;
document.onclick=function(e){
  var i,a=[],n=e.target.value;
  switch(n){
    case "test1":
      a[0]=null;
      a[kMaxGap]=null;
    break;
    case "test2":
      a[kMaxGap]=null;
      a[0]=null;
    break;
    default:return;
  };
  console.time(n);
  for(i=0;i<1E7;i++)a[kMaxGap]=i;
  console.timeEnd(n);
};
</script>

  test1和test2所执行的代码大致相同,唯一的差异就是两个数组元素赋值的先后顺序。如果没有前面的说明就直接拿出这个测试可能会令人感到震惊,赋值顺序也对性能有影响吗?特定的情况下这还真有。如果我们直接对1024位置的元素赋值,由于数组原来的长度是0,从0到1024之间有1024个空位置,这超出了kMaxGap的限制。数组会被转换成字典模式,即使之后再添加其它位置的元素来减小这个稀疏的空间也无法挽救它。如果我们在对1024位置的元素赋值之前在0位置添加一个元素,那么在添加1024位置的元素时空出来的部分只有1023个,没有超出kMaxGap的限制,这样数组就可以保持快速模式。

  测试于:Chrome 31.0.1650.57 m

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