Web 技术研究所

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

JavaScript数组元素的访问效率

  我们先来做一个小小的测试 var s,d,i;
s=[];
s[100]=null;
d=new Date;
for(i=0;i<1E7;i++)s[100];
document.write(new Date-d,"<br/>");
d=new Date;
for(i=0;i<1E7;i++)s[99];
document.write(new Date-d,"<br/>");

  这个代码在Chrome上运行,100这个下标和99这个下标的访问效率就天差地别。不过这个问题仅在其他浏览器上差不多大,这是Chrome上的问题。但是这就可以看出数组的访问效率也是很有文章的,在Chrome下数组元素赋值前被使用就会严重影响效率,其他浏览器也会多少有些影响。所以,我们在写程序时要避免这种情况。
  既然没赋值时被访问会影响效率,那就给要使用的数组元素赋值不就得了。理虽然是这个理,但是就算赋值也会有其他问题。看下面代码 var s,d,i,k;

s=[];
k=1023;
s[k]=null;
d=new Date;
for(i=0;i<1E7;i++)s[k];
document.write(new Date-d,"<br/>");

s=[];
k=1024;
s[k]=null;
d=new Date;
for(i=0;i<1E7;i++)s[k];
document.write(new Date-d,"<br/>");

s=[];
k=1024;
for(i=0;i<k;i++)s.push(null);
s[k]=null;
d=new Date;
for(i=0;i<1E7;i++)s[k];
document.write(new Date-d,"<br/>");

  上面这个运行结果表明:Chrome下在前面数组元素全部未赋值的情况下,1024这个下标比1023这个下标的元素访问效率慢了一倍。但是如果前面的元素都赋上值,在1023和1024之间就不会有这样的差距了。在其它浏览器上也有类似的情形。IE上k的取值不是1023和1024,而是16和17。火狐上k的取值是255和256。这些我就不一一贴代码了,改动上面的代码调试就可以得出结果。
  其实这样搞出一堆数据是很难记住的,仔细看这些数据会发现Chroem下的k取值是10位(10位的二进制最大值是1023),IE下是4位+1,火狐下是8位。IE下多个+1我猜应该是由数组在内部的的初始下标引起的。这样换成二进制位就很容易记住,而且从这个位数差异问题也可以展开了一些列的猜想。不过由于没好好看过V8的源码,所以现在也不敢在这里瞎扯这个问题产生的原因,以后研究透了再写文章说明吧。
网名:
3.80.32.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^