哪个索引在VB数组中变化最快?

时间:2010-09-16 10:42:39

标签: vb6

使用Visual Basic二维数组时,哪个索引变化最快?换句话说,当填写数组时,我应该写...

For i = 1 To 30
    For j = 1 To 30
        myarray (i,j) = something
    Next
Next

For i = 1 To 30
    For j = 1 To 30
        myarray (j, i) = something
    Next
Next

(或者它会产生很大的不同)?

2 个答案:

答案 0 :(得分:3)

Column major。 VB6 uses COM SAFEARRAYslays them out in column-major order。最快的访问是这样的(尽管如果你只有30x30元素就没关系。)

For i = 1 To 30 
    For j = 1 To 30 
        myarray (j, i) = something 
    Next 
Next 

如果确实希望加快数组处理速度,请考虑Advanced Visual Basic by Matt Curland中的提示,它会向您展示如何在底层SAFEARRAY结构中进行搜索。

例如,访问2D SAFEARRAY比访问1D SAFEARRAY慢得多,因此为了将所有数组条目设置为相同的值,绕过VB6的SAFEARRAY描述符并暂时创建自己的SAFEARRAY描述符会更快。第33页。

您还应该考虑在项目属性编译选项中启用“Remove array bounds checks”。

答案 1 :(得分:1)

我不知道是否(或在哪里)指定了这个。它可能留作“实现定义”。

但我希望第一个指数是'较低'维度,即大块,以及随后的指数位置将更加精细。

编辑:似乎我错了。 VB6使用Column-first方法。

  

这有什么不同吗?

你必须测量但是使用外部循环的 lower 更高维度将允许编译器生成更快的代码并且可以更好地利用处理器缓存(局部性)。但是如果尺寸= 30,我不会期望有太大差异。