Performance 组合2个脚本。字典或键/项对集合

Performance 组合2个脚本。字典或键/项对集合,performance,vba,dictionary,collections,vbscript,Performance,Vba,Dictionary,Collections,Vbscript,有没有更有效的方法在VBScript/VBA中组合两个词典?我在下面编写了函数,但我担心会影响性能: Function MergeDicts(Dct1, Dct2) 'Merge 2 dictionaries. The second dictionary will override the first if they have the same key Dim Res, Key Set Res = CreateObject("Scripting.Dictionary"

有没有更有效的方法在VBScript/VBA中组合两个词典?我在下面编写了函数,但我担心会影响性能:

Function MergeDicts(Dct1, Dct2)
    'Merge 2 dictionaries. The second dictionary will override the first if they have the same key

    Dim Res, Key

    Set Res = CreateObject("Scripting.Dictionary")

    For Each Key In Dct1.Keys()
        Res.Item(Key) = Dct1(Key)
    Next

    For Each Key In Dct2.Keys()
        Res.Item(Key) = Dct2(Key)
    Next

    Set MergeDicts = Res
End Function

如果您真的需要合并字典,那么无法避免CreateObject、两个循环和赋值。您可以尝试一下i=0到UBound(dictX.Keys())的计数循环是否更快。只要稍微改变规格(保留第一个字典的值),就可以进行实验wrt。检查Res.Exists(Dct2键)以避免“不必要”的分配

也许是内联线

If Dct1.Exists(key) Then
...
Else
   If Dct2.Exists(key) Then
...

更高效,但这是否是一个好主意显然取决于您的脚本。

如果您想提高性能,请不要使用后期绑定:

改用早期绑定

添加对Microsoft脚本运行时库的引用(转到工具->引用)

然后使用:

Dim Res as New Dictionary

你的算法很好。合并两个字典(每个包含10000键/值对)需要在我的机器上花费
0.046875
秒进行早期绑定,花费
0.069841
进行后期绑定。

您真的需要使用
字典吗?我的意思是,你只需要
还是
键/值
对?@mehow,我确实需要
键/值
对,但即使我只需要
,还有什么选择呢?@neelsg,我已经尝试在数组中存储值/键,然后在合并时操作数组(而不是字典),但表现更差。(
0.046875
用于您的算法和
0.0703125
用于数组)。顺便说一句,我试过使用两个字典,每个字典有10000个键/值对。它们被合并为
0.046875
秒(使用我的答案中的早期绑定)。由于后期绑定,我得到了
0.069841
秒。我不觉得10000双太多。你的算法很好。@neelsg,顺便说一句,你有一点输入错误:
Res=CreateObject(“Scripting.Dictionary”)
应该是
Set Res=CreateObject(“Scripting.Dictionary”)
:)@simoco,oops。我想我在复制/粘贴时删除了它,有一种更有效的合并集合的方法;)看我的answer@mehow-我只是不明白,为什么/如何ArrayList的.AddRange反驳了我的说法,即在字典中需要循环。@Ekkehard.Horner请看我在我自己的答案下面的最后一条评论。它可以很快处理集合的添加。@mehow-很抱歉将我的评论添加到错误的帖子中。Ad rem:如果规范要求使用字典(即通过键访问(非数字索引)且无副本),则使用Arraylist是一个严重错误,即使操作很快。@Ekkehard.Horner虽然我可以部分同意您的意见(规范可能仅限于使用字典结构),但OP要求的是高效版本。。。由于
Dictionary
实现了ICollection,这取决于您实际将如何处理字典中的数据。AFAIK Stack Overflow是专业人士相互学习的地方。当我不同意某人的观点时,我会给出我自己的观点,我会怎么做——列出了优点和优点。我真的不想让你觉得你错了。如果其他人同意你的意见,他们会投票支持你的答案。请不要难过:)我不同意(-1),因为。您可以通过向Microsoft脚本运行时添加引用来避免CreateObject,然后使用Dim d as Dictionary
-早期绑定总是更快。2.在集合上,每个的循环都比使用迭代器的循环快得多。
Dim Res as New Dictionary