ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1786|回复: 6

[求助] 动态数组与固定数组速度比较

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-3-30 08:24 | 显示全部楼层 |阅读模式
话题源于贴: http://club.excelhome.net/forum. ... tid=995573#lastpost

2楼Zamyi的点评
“Zamyi:  动态数组并不慢,而是ReDim Preserve慢。”

之前对动态数组的理解有偏差。
经过测试,证实动态数组在变动少的情况下速度与固定数值差别不大。
在此感谢Zamyi指点。
三人行必有我师。
附测试代码:

固定数组测试:
  1. Sub ArrayTest1()
  2.    
  3.     Dim arr(9999) As Long
  4.     Dim t
  5.     Dim i As Long, j As Long
  6.    
  7.     t = Timer
  8.     For j = 1 To 1000
  9.         For i = 0 To 9999
  10.             arr(i) = i
  11.         Next i
  12.     Next j
  13.     t = Timer - t
  14.     Debug.Print t '.1757813秒
  15.    
  16.    
  17. End Sub
复制代码
动态数组测试
  1. Sub ArrayTest2()
  2.    
  3.     Dim arr() As Long
  4.     Dim t
  5.     Dim i As Long, j As Long
  6.    
  7.     ReDim arr(9999) As Long
  8.     t = Timer
  9.     For j = 1 To 1000
  10.         For i = 0 To 9999
  11.             arr(i) = i
  12.         Next i
  13.     Next j
  14.     t = Timer - t
  15.     Debug.Print t '.1875秒
  16.    
  17.    
  18. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2013-3-30 10:09 | 显示全部楼层
这是测啥呢?这么测本来就没区别

TA的精华主题

TA的得分主题

发表于 2013-3-30 12:23 | 显示全部楼层
时间太短了。。。。
这样测试大部分的误差都是timer计时产生的误差了吧。
timer的精度估计估计得几十毫秒。(没测试过)
别看他后面那么多位数就以为它精度很高

有必要加两个循环吗?
一亿次还是太短了,你再加点看看,我的电脑太垃圾,内存溢出。不过一亿次已经看出差别了
  1. Sub ArrayTest1()
  2.     Dim arr(99999999) As Long
  3.     Dim t
  4.     Dim i As Long, j As Long
  5.     t = Timer
  6.         For i = 0 To 99999999   ’一亿。。。
  7.             arr(i) = i
  8.         Next i
  9.     t = Timer - t
  10.     Debug.Print t '.1757813秒
  11. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-3-30 23:21 | 显示全部楼层
liucqa 发表于 2013-3-30 10:09
这是测啥呢?这么测本来就没区别

在此之前一直认为动态数组慢。精确的定义是扩展动态数组的动作造成效率的急剧下降。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-3-30 23:32 | 显示全部楼层
crazy0qwer 发表于 2013-3-30 12:23
时间太短了。。。。
这样测试大部分的误差都是timer计时产生的误差了吧。
timer的精度估计估计得几十毫秒 ...

外循环的作用是用于放大测试样板的数据,结果和单循环差不多。
  1. Sub ArrayTest1()
  2.     Dim arr(99999999) As Long
  3.     Dim t
  4.     Dim i As Long, j As Long
  5.     t = Timer
  6.         For i = 0 To 99999999   '一亿。。。
  7.             arr(i) = i
  8.         Next i
  9.     t = Timer - t
  10.     Debug.Print t '1.65625
  11. End Sub
  12. Sub ArrayTest2()
  13.     Dim arr() As Long
  14.     Dim t
  15.     Dim i As Long, j As Long
  16.    
  17.     ReDim arr(99999999) As Long
  18.     t = Timer
  19.         For i = 0 To 99999999   '一亿。。。
  20.             arr(i) = i
  21.         Next i
  22.     t = Timer - t
  23.     Debug.Print t '1.804688
  24. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2013-3-31 00:18 | 显示全部楼层
lipton 发表于 2013-3-30 23:21
在此之前一直认为动态数组慢。精确的定义是扩展动态数组的动作造成效率的急剧下降。

扩展动态数组应该一次扩展一定数量的单位的空间,而不是一个单位空间。

在某些语言里面,这个数字是16。你可以根据自己的需要,一次扩展几十、几百或者几千,这样就基本不会影响效率了

TA的精华主题

TA的得分主题

发表于 2013-3-31 00:36 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
论坛上有人做过试验,如果数组不是特别大,固定数组速度要快些,是因为固定数组少了一个redim,除此之外应该没有区别
  1. Sub Macro1()
  2.     Dim arr, brr()
  3.     arr = [a1].CurrentRegion
  4.     ReDim brr(1 To UBound(arr), 1 To 10)
  5. End Sub
  6. Sub Macro2()
  7.     Dim arr, brr(1 To 65536, 1 To 10)
  8.     arr = [a1].CurrentRegion
  9. End Sub
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-12 14:06 , Processed in 0.041913 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表