Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 遍历Scripting.Dictionary/Collection对象_Performance_Vba_Collections_Dictionary_Iteration - Fatal编程技术网

Performance 遍历Scripting.Dictionary/Collection对象

Performance 遍历Scripting.Dictionary/Collection对象,performance,vba,collections,dictionary,iteration,Performance,Vba,Collections,Dictionary,Iteration,我有一个项目,在过去的几年里,它被零零碎碎地改变和修改,从一个代码模块到下一个代码模块,很多都是非标准化的。在某些情况下,我使用了脚本.Dictionary对象,而在其他情况下,我使用了集合对象。对于其中的每一个,有时会有按计数的迭代(即i=1到Obj.count的迭代),有时会有按……的迭代 我希望对尽可能多的此类情况应用相同的逻辑,以使未来的更改更无缝,但我不确定哪种方法是最好的。(我相信一些特定的案例是针对一种或另一种方法编写的,但我也非常确定一些代码可以使用任何可用的方法。) 我尝试创建

我有一个项目,在过去的几年里,它被零零碎碎地改变和修改,从一个代码模块到下一个代码模块,很多都是非标准化的。在某些情况下,我使用了
脚本.Dictionary
对象,而在其他情况下,我使用了
集合
对象。对于其中的每一个,有时会有按计数的迭代(即i=1到Obj.count的迭代),有时会有按……的迭代

我希望对尽可能多的此类情况应用相同的逻辑,以使未来的更改更无缝,但我不确定哪种方法是最好的。(我相信一些特定的案例是针对一种或另一种方法编写的,但我也非常确定一些代码可以使用任何可用的方法。)

我尝试创建一个测试子来帮助我确定这些方法中哪种效果最好,但结果有些不一致。总的来说,在
字典中循环每个
项目
似乎更快,但在某些情况下,我的测试显示在
集合中循环每个
项目
更快。方差可能取决于在任何给定时间系统中发生的其他一切

我想知道是否有人对哪种方法始终是最快的有明确的答案,假设循环中的所有其他方法都是相同的。或者,是否有一些方法可以改进我的测试子系统,使其在返回结果时更加一致,以便我能够自己回答这个问题

我提出的测试代码:

选项显式
子测试\字典\迭代\速度()
Dim Coll1作为新集合,Coll2作为新集合
Dim Dict1作为新脚本。Dictionary,Dict2作为新脚本。Dictionary,Dict3作为新脚本。Dictionary
尺寸i为整数,j为整数,l为整数
暗淡的开始时间为单身,停止时间为单身
Dim v作为变体
Dim Obj As TestObject“一个自定义类,只有一个成员变量MainVal,没有函数/子类
对于i=0到32766
Set Obj=newtestobject
Obj.MainVal=i
第1条添加CStr(i),Obj
第2条添加CStr(i),Obj
第3条添加CStr(i),Obj
Coll1.添加Obj,CStr(i)
Coll2.添加Obj,CStr(一)
接下来我
StartTime=计时器()
对于j=0到1。计数-1
l=CInt(Dict1(CStr(j)).MainVal)
设置Obj=Dict1(CStr(l))'在循环中做一些有用的事情
Set Obj=无
1.拆除CStr(l)
下一个j
StopTime=计时器()
调试。打印“从x到y的Dict1:&StopTime-StartTime”
StartTime=计时器()
对于第2条中的每个v项
l=CInt(v.MainVal)
设置Obj=Dict2(CStr(l))
Set Obj=无
2.拆除CStr(l)
下一个v
StopTime=计时器()
Debug.Print“Dict2 for each item:”&StopTime-StartTime
StartTime=计时器()
对于Dict3.键中的每个v
l=CInt(Dict3(v).MainVal)
设置Obj=Dict3(CStr(l))
Set Obj=无
第3条:拆除CStr(l)
下一个v
StopTime=计时器()
Debug.Print“Dict3 for each key:”&StopTime-StartTime
'------------词典和藏书的划分
StartTime=计时器()
对于j=0到Coll1。计数-1
l=CInt(Coll1(CStr(j)).MainVal)
设置Obj=Coll1(CStr(l))
Set Obj=无
Coll1.拆下CStr(l)
下一个j
StopTime=计时器()
Debug.Print“Coll1 for x to y:”&StopTime-StartTime
StartTime=计时器()
对于Coll2中的每个v
l=CInt(v.MainVal)
设置Obj=Coll2(CStr(l))
Set Obj=无
Coll2.移除CStr(l)
下一个v
StopTime=计时器()
Debug.Print“Coll2 for each item:”&StopTime-StartTime
调试。打印vbNewLine&“----”&vbNewLine
端接头
输出的真实示例,表明“最佳”选项并不总是相同的:

x到y的Dict1:0.2011719
每项2条:0.1738281
每个键的Dict3:0.2167969
x到y的Coll1:0.2050781
每个项目的Coll2:0.1386719


x到y的Dict1:0.1875
每项2条:0.171875
每个键的Dict3:0.234375
x到y的Coll1:0.2050781
每个项目的Coll2:0.1542969


x到y的Dict1:0.25
每项2条:0.21875
每个键的Dict3:0.265625
x到y的Coll1:0.234375
每个项目的Coll2:0.171875


x到y的Dict1:0.265625
每一项的口述2:0.203125
每个键的Dict3:0.296875
x到y的Coll1:0.234375
每个项目的Coll2:0.21875


x到y的Dict1:0.265625
每项2条:0.1875
每个键的Dict3:0.234375
x到y的Coll1:0.203125
每个项目的Coll2:0.15625


x到y的Dict1:0.28125
每个项目的口述2:0.1875
每个键的Dict3:0.25
x到y的Coll1:0.234375
每个项目的Coll2:0.1875


x到y的Dict1:0.28125
每一项的口述2:0.21875
每个键的Dict3:0.328125
x到y的Coll1:0.234375
每个项目的Coll2:0.234375

除非您知道给定语句或过程的执行时间是一个问题,否则您不应该在优化上浪费人力时间。首先进行设计和调试,然后如果您认为速度太慢(可能不会),则进行概要分析,然后进行优化(执行时间通常会浪费在与您想象完全不同的地方)

每个
结构的
都很漂亮、简洁、整洁。不使用它的唯一原因是,如果要从循环的集合中删除项目。然后你可能会跳过某些项目。如果您计划删除项目,请在索引上循环,后退