ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] 数据类型与效率的问题(无解)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2010-11-25 15:32 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
看下面两段小程序,先不运行,比较t1和t2用时:
Sub TestA1()
Dim R()
n = 60000
ReDim R(1 To n, 1 To 1)
[a:a] = ""
For i = 1 To n
  R(i, 1) = "中国"
Next

t = Timer
Cells(1, 1).Resize(n) = R
t1 = Timer - t

[d1] = t1
End Sub
Sub TestA2()
Dim R() As String
n = 60000
ReDim R(1 To n, 1 To 1)
[a:a] = ""
For i = 1 To n
  R(i, 1) = "中国"
Next

t = Timer
Cells(1, 1).Resize(n) = R
t2 = Timer - t

[d2] = t2
End Sub

再如:
Sub TestB1()
n = 10000
Set d = CreateObject("scripting.dictionary")

t = Timer
For i = 10000001 To 10000000 + n
  d(i) = ""
  Next
t1 = Timer - t

Set d = Nothing
[e1] = t1
End Sub

Sub TestB2()
n = 10000
Set d = CreateObject("scripting.dictionary")

t = Timer
For i = 10000001 To 10000000 + n
  s = "" & i
  d(s) = ""
  Next
t2 = Timer - t

Set d = Nothing
[e2] = t2
End Sub
运行后会不会惊讶?谁能解释?

[ 本帖最后由 Zamyi 于 2010-11-29 17:35 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-11-25 15:58 | 显示全部楼层
前面两段还好理解,VBA需要时间辨别variant类型的变量存储了何种数据,用时会长些
第二个对字典没什么研究,还请高人解释吧

TA的精华主题

TA的得分主题

发表于 2010-11-25 17:42 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
字典的速度差异,我估计是因为字典内部Hash算法对大整数的Hash处理比较慢的原因

一般来说,Hash过程都要做至少一次乘法和一次除法,大整数可能导致更多的运算

比方说可能要处理溢出问题,可能要多做一次除法

变成字符串以后,Hash过程会把字符串转换为数字去计算Hash值,转换后的数字可能实际上小得多,反倒更快

因为只要把For i = 10000001 To 10000000 + n
改为 For i = 1 To  n
速度就很快了

不过老实说,这还真是个怪异的现象

[ 本帖最后由 灰袍法师 于 2010-11-25 17:46 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-11-25 19:16 | 显示全部楼层
调试了一会..........发现b1,b2真的很怪.....

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-11-26 09:10 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
原帖由 honggexjq 于 2010-11-25 15:58 发表
前面两段还好理解,VBA需要时间辨别variant类型的变量存储了何种数据,用时会长些
第二个对字典没什么研究,还请高人解释吧

如果理解为“VBA需要时间辨别variant类型的变量存储了何种数据”,那么你把"中国"以为"123456"再试试!

[ 本帖最后由 Zamyi 于 2010-11-26 09:21 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-11-26 10:05 | 显示全部楼层
我测过还是string稍快些,但是头两个程序时间的差异远没有后两段程序来的大

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-11-26 10:19 | 显示全部楼层
用"中国"测试,t1/t2=12.18,用"123456"测试,t1/t2=1.14,两者相差10倍以上。

TA的精华主题

TA的得分主题

发表于 2010-11-26 10:36 | 显示全部楼层
用“中国”我测出来T1/T2=1.56呵呵
楼主你可以多测几次然后取平均

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-11-26 11:07 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
原帖由 honggexjq 于 2010-11-26 10:36 发表
用“中国”我测出来T1/T2=1.56呵呵
楼主你可以多测几次然后取平均

没错呀:
Public Sub TT()
TestA1 "123456"
TestA2 "123456"
Range("d:d").Insert
TestA1 "中国"
TestA2 "中国"
End Sub
Sub TestA1(S$)
Dim R()
n = 60000
ReDim R(1 To n, 1 To 1)
[a:a] = ""
For i = 1 To n
  R(i, 1) = S
Next
t = Timer
Cells(1, 1).Resize(n) = R
t1 = Timer - t
[d1] = t1
End Sub
Sub TestA2(S$)
Dim R() As String
n = 60000
ReDim R(1 To n, 1 To 1)
[a:a] = ""
For i = 1 To n
  R(i, 1) = S
Next
t = Timer
Cells(1, 1).Resize(n) = R
t2 = Timer - t
[d2] = t2
End Sub

TA的精华主题

TA的得分主题

发表于 2010-11-26 11:24 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. For i = 1 To 100
  2.     [a:a].Clear
  3.     t = Timer
  4.     Cells(1, 1).Resize(n) = R
  5.     t1 = Timer - t
  6.     [d1] = [d1] + t1
  7. Next
  8. [d1] = [d1] / 100
复制代码
改这样试试,还差很多就不知道什么原因了,也许是电脑差别?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-16 21:45 , Processed in 0.025179 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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