ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] collection代替数组与redim preserve的效率比较

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-12-6 17:35 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
下午终于有了点空闲时间,来论坛里溜达了一圈没啥新鲜好玩的,便争分夺秒系统的学习了一下collection对象。方法属性太少,学起来很简单。
刚学习完还兴高采烈了一番,以后终于不用redim preserve数组了,——感觉上,包括论坛里前辈们的说法,这样效率很低。
装入collection对象数组,然后直接定义一个完美尺寸的数组将collection的item倒进去直接糊单元格里效率应该要快一些。——我是这样想的,结果一试验,大失所望。效率低到简直不能忍。

没有丁点儿有含量的东西,只是我试验了而可能很多老师一直在用没有验证过而已,所以发上来。
若试验方法错误,还请老师们指正。

Option Explicit
Option Base 1

Sub test()
Dim col As New Collection
Dim i&
Dim brr()
Dim t As Single
t = Timer
For i = 1 To 30000
    col.Add Fix(Rnd * i)
Next
ReDim brr(col.Count, 1)
For i = 1 To UBound(brr)
    brr(i, 1) = col(i)
Next
[a1].Resize(UBound(brr)) = brr
MsgBox Format(Timer - t, "0.0000")
Set col = Nothing
End Sub


Sub test2()
Dim brr()
Dim i&, n&
Dim t As Single
t = Timer
For i = 1 To 30000
    n = n + 1
    ReDim Preserve brr(1, n)
    brr(1, n) = Fix(Rnd * i)
Next
[b1].Resize(n) = Application.Transpose(brr)
MsgBox Format(Timer - t, "0.0000")
End Sub





方法一用时3.2秒多,方法二用时不到0.6秒









TA的精华主题

TA的得分主题

发表于 2019-12-6 18:53 | 显示全部楼层
确实方法2速度快好多……

TA的精华主题

TA的得分主题

发表于 2019-12-6 19:03 来自手机 | 显示全部楼层
https://www.cnblogs.com/gyc19920704/p/5420230.html
你的一个是2次循环,后者是1次,不具有可比性的。
另外,collection的for each会快点。
collection保存的是对象,可以看看上面的链接。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-6 19:08 来自手机 | 显示全部楼层
按说在循环当中使用 redim preserve 会很拖累速度,尤其最后又用了 transpose 应该更慢,结果让人比较意外。不知道是不是因为纯数值的缘故。
怪不得老师们一直推崇数组+字典,原来都是实践出来的经验

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-6 20:41 来自手机 | 显示全部楼层
zpy2 发表于 2019-12-6 19:03
https://www.cnblogs.com/gyc19920704/p/5420230.html
你的一个是2次循环,后者是1次,不具有可比性的。
...

谢谢老师。
两次循环也是没有办法的事,他不支持一次性输出。
但开始我以为即使这样也会比 Redim preserve 快的,因为毕竟循环的效率很高,都是在内存中操作的。
看了您给的链接,明天试一下 for each。但即使速度差不多,也不如用redim preserve了,毕竟要多一次循环。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-6 20:51 来自手机 | 显示全部楼层
zpy2 发表于 2019-12-6 19:03
https://www.cnblogs.com/gyc19920704/p/5420230.html
你的一个是2次循环,后者是1次,不具有可比性的。
...

另外,我看老师们一般都是在类模块里用collection,很多东西我都还没学。这里只是说,想拿来当数组用,没有什么优势,不如数组+字典

TA的精华主题

TA的得分主题

发表于 2019-12-6 20:56 来自手机 | 显示全部楼层
月关 发表于 2019-12-6 20:41
谢谢老师。
两次循环也是没有办法的事,他不支持一次性输出。
但开始我以为即使这样也会比 Redim prese ...

Collection 对象将每一项存储于 Variants 对象中。于是,能够添加到 Collection 对象里的内容列表就和能够存储到 Variants 中的内容列表是相同的。这包括标准数据类型、对象和数组- 但不包括用户定义类型。 不管 Variants 中存储的是什么,它都占 16 字节,因此使用 Collection 对象不如使用数组的效率高


这段看看吧,有时间可以研究下arraylist对象,还有npoi,可以研究的的确不少,哈哈

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-6 21:13 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zpy2 发表于 2019-12-6 20:56
Collection 对象将每一项存储于 Variants 对象中。于是,能够添加到 Collection 对象里的内容列表就和能 ...

你们炫技已经炫得我眼花缭乱的了,前阵子被各位老师带跑偏了,老师们展示什么我都想学。
这阵子终于冷静了下来,我只是一个刚自学了半年的小学生,要学的东西固然很多,路也很长,一步一个脚印,慢慢来吧

TA的精华主题

TA的得分主题

发表于 2020-2-17 16:12 来自手机 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-25 05:18 , Processed in 0.038500 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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