5

我想知道在 VB.NET 中检查数组是否为空的最快方法。数组已经初始化,所以我不能使用任何查看它的检查。这是下面的当前代码:

If Not (cubes(threadnumber)(i).objects.GetLength(0) = 0) Then
   cubes(threadnumber)(i).objects = New Double() {}
   ReDim cubes(threadnumber)(i).objects(-1)
End If

我已经做了一些测试,我知道使用.GetUpperBound速度会快一点,但我不确定这是否可行,因为我认为.GetUpperBound如果数组长度为 1,则返回 0。

任何/所有加快速度的方法(即使是一小部分)都将非常有帮助。这个程序需要很长时间才能完成,上面代码的第一行占了很大一部分时间,它被称为 1.36 亿次。

此外,如果有人知道如何加速 For...Next 循环,那也很棒!

4

4 回答 4

5

LengthGetLength我的系统快大约 2 倍(调用Length136M 次需要 0.650 秒,而调用GetLength (0)需要 1.480 秒)。

我也不明白你为什么要重新调整你的阵列,你已经创建了一个新阵列。

如果多维数据集是多维数组,我相信这将是最快的代码:

If cubes(threadnumber)(i).objects.Length > 0 Then
    cubes(threadnumber)(i).objects = New Double() {}
End If

如果多维数据集不是多维数组(例如 List),则应将cubes(threadnumber)代码移出循环。

更新

Length比在没有调试器的情况下以发布模式运行时快 6 倍,在这种情况下,的系统需要 0.181 秒和1.175 秒。这很可能是因为 JIT 会内联对 的调用,而不是对 的调用。GetLengthLengthGetLengthLengthGetLength

是我使用的测试代码。

于 2012-11-22T09:01:43.403 回答
2
if myarray is nothing then...

或者

if myarray isnot nothing then...
于 2012-11-22T05:29:12.420 回答
1

GetLength 是我所知道的查看数组中是否包含元素的最快方法。我认为您不会加快这段代码的速度。

但是,调用这 1.36 亿次的代码可能会被优化。

查看您的代码:

If Not (cubes(threadnumber)(i).objects.GetLength(0) = 0) Then
   cubes(threadnumber)(i).objects = New Double() {}
   ReDim cubes(threadnumber)(i).objects(-1)
End If

我猜你测试它是否有元素的原因是你可以重新调整数组以释放内存。释放内存的更好方法可能是清除立方体对象并允许数组超出范围。

于 2012-11-22T06:12:57.553 回答
0

经过一些深入的测试和分析,我发现似乎是最快的方法(至少到目前为止)。做出这个小小的改变使我的程序加快了 500-600%。

当有一个项目添加到对象数组时,如果第二维的索引不在列表中,我还将立方体的第二维的索引添加到列表中。不过,任何其他建议都会受到欢迎。

于 2012-11-23T02:46:01.693 回答