ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] VBA数组运算速度 - ReDim 和 ReDim Preserve 速度对比

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2013-5-6 19:06 | 显示全部楼层
我只有学习学习的份,不懂呀!!!!!!!!

TA的精华主题

TA的得分主题

发表于 2013-5-6 21:09 | 显示全部楼层
本帖最后由 灰袍法师 于 2013-5-6 21:17 编辑
jinbo3535 发表于 2013-5-5 22:37
原来计算机是这样运算的!老师,您不说,这些资料应该很难找到的!谢谢你···

只有在程序中查找数组元素才有可能是这样的二分法查找

如果是计算机内部寻址

那么  redim 的实际意义是 重新分配内存!
而 redim preserve 是重新分配内存以后,再复制之前所有数据!!!  所以奇慢无比。

而二维数组比一维数组慢的原因,是因为采用了不同的内存寻址方式,没记错的话,起码有十几种寻址方式。。。。。。

不过正如楼上许多大侠提到的:如果一个VBA跑起来不慢,那么也没必要去做这些优化。

优化背后的实现细节,就更加不是VBA用户必须掌握的知识了,有兴趣就学点,没兴趣又用不上就算了呗。


TA的精华主题

TA的得分主题

 楼主| 发表于 2013-5-6 21:14 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
灰袍法师 发表于 2013-5-6 21:09
只有在程序中查找数组元素才是这样,如果是计算机硬件内部寻址
那么  redim preserve 的实际意义是 重新 ...

谢谢灰炮老师的指导···

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-5-6 21:19 | 显示全部楼层
flf19720321@163 发表于 2013-5-6 19:06
我只有学习学习的份,不懂呀!!!!!!!!

我的乖乖,数组是个好东西呀!以前只听说它快,到底多快没试过!如果,你处理的数据量大,那你就会发现,它运算速度太惊人了!我这十几天,都在学这个,深有体会···

TA的精华主题

TA的得分主题

发表于 2013-5-6 21:23 | 显示全部楼层
小花鹿 发表于 2013-5-6 00:29
请教版主:
是定义一个足够大的数组好,还是Preserve 好?
我的理解是:定义一个足够大的数组肯定会浪费 ...

直接 dim 一个 100MB 的数组,对目前的机器来说,这点内存也不值一提。

所以我认为绝大多数情况下,直接  dim 一个肯定用不完的数组就行了

另一个方法是,先 dim 10MB,然后不够的时候每次 redim 增加 10MB

这样就避免了大量 redim 的减速问题。

代价是自己在程序中要算准什么时候需要 redim 。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-5-6 21:24 | 显示全部楼层
灰袍法师 发表于 2013-5-6 21:09
只有在程序中查找数组元素才有可能是这样的二分法查找

如果是计算机内部寻址

感谢法师的指导,专家毕竟是不同的啊。

TA的精华主题

TA的得分主题

发表于 2013-5-6 21:30 | 显示全部楼层
小花鹿 发表于 2013-5-6 00:53
请教老师问题2:
我学习VBA的方法是:先不考虑速度,不管三七二十一,先把正确结果弄出来,速度的问题慢 ...

这个是可以的。

而且,由于现在普通电脑的配置也已经很不错了,对速度的影响大大降低。

TA的精华主题

TA的得分主题

发表于 2013-5-6 21:40 | 显示全部楼层
小花鹿 发表于 2013-5-6 01:23
请教老师问题4:
有时候看到个别代码借助辅助单元格进行数据处理(具体例子现在找不出来),我觉得这种做 ...

借助辅助单元格作为临时数据的储存这个方法非常地不好,绝对不可以哦!

…………
曾经有一个新手的求助帖,也做了这样的测试:
在单元格A1中反复写入数据……for……next循环几十万次以后,Excel占用的内存到了无法仍受的地步,
并且所占用的内存无法清除(在保存、关闭该文件之前无法释放、或清除VBA占用的内存。)

…………
原因是这样子的:
Excel会使用内存保存你做的所有单元格操作,以便进行恢复。
为此目的所占用的内存,只有在保存文件后才能被释放……(保存文件后就不能执行恢复功能了。)

有意思的是,当你使用VBA对单元格进行操作时,Excel程序仍然占用了相应的内存,
但却不能对VBA的行为进行恢复操作。

因此,良好的习惯是:
VBA可以随时读取单元格信息,但不应该频繁地向单元格内写入信息……这会不当占用内存且不可释放!

因此,仅仅允许在VBA执行完毕时最后阶段输出结果到工作表。


评分

4

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-5-6 21:47 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
香川群子 发表于 2013-5-5 21:46
使用VBA内存数组时,读、写入数组时首先需要检索行、列位置。

而数组中定位置也并非人类脑子中想一想那么 ...

因此,你当然可以理解下述结果:
一维数组显然要比二维数组速度更快一些。因为只需确定1个列位置就够了,少了一次定位计算。
==================================================
不仅仅是少了一个定位参数
还因为 计算机硬件本身就难以快速访问多维数组,需要比一维数组多得多的机器指令。

所以一个简单的加速技巧是
把 dim arr(1 to 100, 1 to 4) 改为 dim arr(1 to 400)
然后自己的代码把所有的 arr(m, n) 改为  arr(  4*(m-1) + n )
这样就在代码内部把二维数组的访问,改为一维数组的访问,会加速一点点。
当然,这点加速幅度其实也不值一提。。。。。。

下图来自《汇编语言编程艺术》英文版。
多维数组.jpg

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-5-6 21:51 | 显示全部楼层
小花鹿 发表于 2013-5-6 00:29
请教版主:
是定义一个足够大的数组好,还是Preserve 好?
我的理解是:定义一个足够大的数组肯定会浪费 ...

折中的方法是:

1. 直接定义一个适当大小的数组……
  如果本来行数不多几千、几万行,那么直接定义新数组为相同行数即可 (见赵版说明)
  或者定义2003版最大行数 65536行

2. 一开始定义一个数组增量kc如kc= 1000行(或5000行 或10000行)
   然后每次新数组实际增量k=k+1 以后,再if判断k=1000时,才使用Redim Preserve brr(1 to k + 1000)
   这样的话,Redim Preserve 语句的实际使用次数就大大减少了……

  举例如:
  sub test()
       kc=1000
       redim brr(1 to kc)
       k=1
      …………
       brr(k)=x
       k=k+1
       if k mod kc = 0 then redim preverse brr(1 to k+kc)

      ……


评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-28 23:04 , Processed in 0.043616 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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