玖叶教程网

前端编程开发入门

For Each遍历数组真的比For i=L to U要慢么?

前言

在前篇《挖个VB/VBA数组的小秘密,颠覆下常规!》介绍了数组除了常规按下标遍历外,其实还可以通过For Each Next进行遍历。在VB/VBA中,通常For Each Next的性能表现要优于对象的其他遍历方式,那数组是否也是这样呢?

有网友测了下,貌似速度要慢很多。真实情况是怎样的呢?本篇就来实例测一测。

一、初测,For Each Next的确要慢不少

为说明问题,BtOfficer写了上图所示的测试函数,里面包含常规和For Each两种遍历,然后在下图所示的计时函数中,将其重复调用10万次,来看看结果吧。

结果常规遍历平均值大概在820毫秒左右,而For Each遍历平均在1100毫秒左右。显然,后者要慢一些。相信网友测试也是这么个结果,但结论是否就成立了呢?

二、修正测试中的不公平因素后,二者相差无几

在上面的测试函数testArray中,都只涉及到数组数据的读取,但对For Each测试是不公平的。因为,遍历时,Var本身就已经读出数组元素的值了,但上述写法中,还多了将Var进行了跨类型赋值操作。所以,应当去掉赋值操作,二者才是公平的。

修改后,测试For Each遍历,多次平均值也在820毫秒左右,所以遍历速度上For Each并不比常规遍历慢。

三、其实,For Each遍历性能更高

在前述测试中,都是将数组元素的值写到1个变量中,但常规模式下没有类型转换,而For Each遍历,却存在类型转换。我们知道,在VB/VBA中,Variant类型带来的类型转换开销,是制约其性能表现的最常见因素。

如果刨去这个类型转换的开销,For Each的遍历速度是要超过常规下标遍历的。但实际应用中,数组元素值写入Var时进行了类型转换,使用Var时,往往会再次转换,所以整体上性能就下来了。

那For Each遍历是否就没有使用价值了呢?当然不是的,For Each遍历主要在写法上比较简洁,而且它揭示了VB/VBA数组的与众不同。有没有方法避免类型转换,从而提升效率呢?答案当然是有的,那就是使用指针。

欢迎关注BtOfficer,有任何VB/VBA相关的疑问,都可以评论留言哦。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言