检查数组是否为空的最快方法

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会稍微快一点,但我不确定这是否有效,因为如果数组长度为1,则.GetUpperBound返回0。
任何/所有加速此过程的方法(即使只是微小的)都将非常有帮助。该程序需要很长时间才能完成,上面代码的第一行占用了大部分时间,它被调用了1.36亿次。
此外,如果有人知道如何加速For...Next循环,那就太好了!

加速下一次循环的最简单方法是使用循环展开,但现在大多数编译器都会自动完成此操作。将任何静态到循环或多次使用的去引用提取出来,并避免任何装箱和拆箱。以下是一篇关于.net托管代码优化和成本分析的好文章:http://msdn.microsoft.com/en-us/library/ms973852.aspx - Aaron
@Aaron 感谢回复(虽然是在我提问两年后!):)。自从发帖以来,我已经阅读了很多关于优化的文章,但具体来看一个数组是否为空对于我的大量数组来说速度太慢了。 - FraserOfSmeg
1
永远不会太晚!好吧,也许我应该看一下问题和答案的日期;但它确实有了很棒的部分问题。你提出的解决方案大体上会成为我的初始答案。基本上,当访问对象的属性过于昂贵时,可以在一个更简单/更快的类型中自行跟踪它。干杯! - Aaron
4个回答

5

Length 在我的系统上比 GetLength 快约两倍(调用 Length 136M 次只需 0.650 秒,而调用 GetLength (0) 则需要 1.480 秒)。

我也不明白为什么你要重新定义数组大小,因为你已经创建了一个新的。

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

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

如果cubes不是多维数组(比如List),你应该将代码移到循环外面。
更新
在没有调试器的Release模式下运行时,Length比GetLength快6倍,此时Length在我的系统上需要0.181秒,而GetLength需要1.175秒。这可能是因为JIT会内联调用Length,但不会内联调用GetLength。
这是我使用的测试代码:This

1
if myarray is nothing then...

或者

if myarray isnot nothing then...

3
嗯,我刚刚重新读了你的问题,这可能不是你想要的信息。抱歉。 - sj1900
谢谢回复,但是主要问题在于到处都建议检查它是否已经初始化,而不是为空。还是谢谢你的尝试 :) - FraserOfSmeg
我的理解是,如果它没有被初始化,它相当于VB.NET中的“nothing”。但说实话,我不确定你想要实现什么。 - sj1900
这也是我的理解-未初始化=无。由于我不得不编写所有数组的方式,因此所有数组都已初始化,但只有一些数组长度> 0。 - FraserOfSmeg
啊,我明白了。我会闭嘴,让那些知道他们在说什么的人(比如 Derek)提供有用的信息。 - sj1900

1

GetLength是我所知道的最快速的方法,用于查看数组中是否有元素。我认为你不会加速这段代码。

然而,调用此函数136百万次的代码可能需要进行优化。

看着你的代码:

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

我猜你测试它是否有元素的原因是为了重新定义数组以释放内存。更好的释放内存的方法可能是清除cubes对象,让数组超出范围。

0

经过一些密集的测试和分析,我发现似乎已经找到了最快的方法(至少目前为止)。这个小改变让我的程序加速了500-600%。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接