香川群子 发表于 2014-3-24 16:04
正好现在有些空余时间,简单写了个模拟代码:毫无疑问数据量较大时,使用2个字典反而速度效率更好。
为 ...
每个人都不容易,不管是做什么,人与人之间需要的是多一些体谅,多一些理解。
OK,我不是什么高手,不是科班出身,VBA全部靠自学来的。我大学学的是植物保护,与计算机毫不沾边,所以对于你的高深理论才疏学浅,不仅仅看不懂,甚至完全无知。
作为EP的版主,hwc2ycy所倾注的时间是若干人的N倍,烟花技法可能不那么成熟,但绝对是hwc2ycy呕心沥血的作品,而且其严谨性、知识性和实用性是绝对值得一看的。
我话说得有点过头,无所谓,男子汉大丈夫,头顶天,脚踏地,言出必行,就算是输了版主的职务,我依然会力挺hwc2ycy,他的作品绝非您这位大师所呲之以鼻的不予认可的毫无技巧的玩意儿。
再言之,就算我辈技不如人,但不蒸馒头争口气,就算是版主与版主之间的惺惺相惜也好,也不至于被人冠以“淫”技也毫不反击。
代码你看好了:- Sub test()
- Dim arr$(), d As Object, d1 As Object, d2 As Object, i&, j&, k&, m&, p&, tms#
- p = 2
- m = 10 ^ 4
- ReDim arr$(1 To m, 1 To 2)
- For i = 1 To m
- arr(i, 1) = 2 * i - 1
- arr(i, 2) = 2 * i
- Next
- Debug.Print vbCr; Format(m * 10 ^ p, "#,##0"); vbCr
- tms = Timer
- Set d1 = CreateObject("Scripting.Dictionary")
- Set d2 = CreateObject("Scripting.Dictionary")
- For j = 1 To 20000
- For i = 1 To 128
- d1(arr(i, 1)) = arr(i, 2)
- d2(arr(i, 2)) = arr(i, 1)
- Next
- Next
- Set d1 = Nothing
- Set d2 = Nothing
- Debug.Print "You:" & Format(Timer - tms, "0.000s")
- tms = Timer
- Set d = CreateObject("Scripting.Dictionary")
- For j = 1 To 20000
- For i = 1 To 128
- d(arr(i, 1)) = arr(i, 2)
- d(arr(i, 2)) = arr(i, 1)
- Next
- Next
- Set d = Nothing
- Debug.Print "Me :" & Format(Timer - tms, "0.000s"), vbCrLf
- tms = Timer
- Set d1 = CreateObject("Scripting.Dictionary")
- Set d2 = CreateObject("Scripting.Dictionary")
- For j = 1 To 1000
- For i = 1 To 2560
- d1(arr(i, 1)) = arr(i, 2)
- d2(arr(i, 2)) = arr(i, 1)
- Next
- Next
- Set d1 = Nothing
- Set d2 = Nothing
- Debug.Print "You:" & Format(Timer - tms, "0.000s")
- tms = Timer
- Set d = CreateObject("Scripting.Dictionary")
- For j = 1 To 1000
- For i = 1 To 2560
- d(arr(i, 1)) = arr(i, 2)
- d(arr(i, 2)) = arr(i, 1)
- Next
- Next
- Set d = Nothing
- Debug.Print "Me :" & Format(Timer - tms, "0.000s")
- End Sub
复制代码 你自己测试。
为什么我会改变循环的范围,原因在于字典上面代码中,字典的最大数目是256个。
为什么用128。因为你的两个数组d1,d2和d数组均不会超出256的范围。也就是d(arr(i,1))循环会始终在范围内运行。
才疏学浅,我解释不了为什么时间长短不一,或许当字典元素超出256个范围,不存在的情况下,每循环一次可能都要“完全寻址”一次,所以时间长短不一吧!!!! |