JavaScript性能之 数组

最近看了《JavaScript高级程序设计(第二版)》和《JavaScript语言精粹》这两本书。发现其中对于数组的解释不一样。于是个人写了些代码做测试,做个记录&分享。同时也想碰到个大婶看看我的测试代码写的是否正确。

 

先看《JavaScript高级程序设计(第二版)》中的说法吧。

         

这段话说JavaScript中的数组和其他语言中的数组一样,访问数组与访问常量的计算复杂度都是O(1),所以访问数组比访问对象快。但是《JavaScript语言精粹》中却说,

这里的意思是JavaScript中的数组和其他对象一样,也就是访问数组和访问对象的复杂度都不是O(1)。为了验证孰是孰非,今天上午写了个测试代码。进行验证,以下是代码

 

[javascript] view plaincopyprint?
  1. var array = [],  
  2.     i = 0,  
  3.     object = {},  
  4.     value = -1,  
  5.     beginTime = null,  
  6.     endTime = null;  
  7. beginTime = new Date();  
  8. for (i = 1000000; i > 0; i--) {  
  9.     array.push(i);  
  10. }  
  11. endTime = new Date();  
  12. document.writeln('数组创建时间为:' + (endTime - beginTime) + 'ms<br/>');  
  13.   
  14. beginTime = new Date();  
  15. for (i = 1000000; i > 0; i--) {  
  16.     object.i = true;  
  17. }  
  18. endTime = new Date();  
  19. document.writeln('对象创建时间为:' + (endTime - beginTime) + 'ms<br/>');  
  20.   
  21. beginTime = new Date();  
  22. for (i = 1000000; i > 0; i--) {  
  23.     value = array[i];  
  24. }  
  25. endTime = new Date();  
  26. document.writeln('数组访问时间为:' + (endTime - beginTime) + 'ms<br/>');  
  27.   
  28. beginTime = new Date();  
  29. for (i = 1000000; i > 0; i--) {  
  30.     value = object.i;  
  31. }  
  32. endTime = new Date();  
  33. document.writeln('对象访问时间为:' + (endTime - beginTime) + 'ms<br/>');  
  34.   
  35. beginTime = new Date();  
  36. for (i = 1000000; i > 0; i--) {  
  37.     value = i;  
  38. }  
  39. endTime = new Date();  
  40. document.writeln('常量访问时间为:' + (endTime - beginTime) + 'ms<br/>');  

以下是测试结果,

IE

Firfox

Chrome

实测结果证明《JavaScript语言精粹》中的解释是符合实际情况的,而且数组的创建和访问要慢于对象创建和访问速度。

对于什么时候用数组什么时候用对象,《JavaScript语言精粹》中建议当需要像这样“[n]”访问时用数组,其他情况都用对象。个人认为比较合理。

另外测试意外收获,IE不是一般的慢啊。差了一个数量级了。

最后测试环境,Window7系统,IE9,Firfox 15.01,Chrome  22.0.1229.94 m。

先到这里了,如果我的测试代码有问题请指出。谢谢!!!

posted @ 2012-10-25 16:21  chaos.forfun  阅读(256)  评论(0编辑  收藏  举报