Arrays 检查数组是否为空的最快方法
我想知道在VB.NET中检查数组是否为空的最快方法。数组已经初始化,所以我不能使用任何检查。以下是当前代码:Arrays 检查数组是否为空的最快方法,arrays,vb.net,performance,optimization,Arrays,Vb.net,Performance,Optimization,我想知道在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会快
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亿次
另外,如果有人知道如何加快…下一个循环,那也太好了
if myarray is nothing then...
或
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
我猜您测试它是否有元素的原因是为了可以重拨阵列以释放内存。释放内存的更好方法可能是清除多维数据集对象,并允许数组超出范围。
Length
比我的系统上的GetLength
快约2倍(调用Length
136M次需要0.650秒,而调用GetLength(0)
则需要1.480秒)
我也不明白你为什么重拨你的阵列,你已经创建了一个新的
如果多维数据集是多维数组,我相信这将是最快的代码:
If cubes(threadnumber)(i).objects.Length > 0 Then
cubes(threadnumber)(i).objects = New Double() {}
End If
如果多维数据集不是多维数组(例如列表),则应将cubes(threadnumber)
代码从循环中取出
更新
在没有调试器的发布模式下运行时,Length
比GetLength
快6倍,在这种情况下,Length
在我的系统上需要0.181s和GetLength
1.175s。这可能是因为JIT将内联对Length
的调用,而不是对GetLength
的调用
是我使用的测试代码。经过一些密集的测试和分析,我找到了似乎是最快的方法(至少到目前为止)。做了这个小小的改变,我的程序加快了500-600%
当有一个项目添加到对象数组中时,如果第二维度的索引不在列表中,我也会将多维数据集第二维度的索引添加到列表中。不过,任何其他建议都是欢迎的。嗯,我刚刚又读了一遍你的问题,这可能不是你想要的信息。很抱歉,谢谢你的回复,但这其中的主要问题是,everywhere建议检查它是否未初始化,而不是为空。感谢您尝试:)我的理解是,如果它还没有初始化,它就相当于VB.NET“nothing”。但老实说,我不确定你到底想完成什么。这也是我的理解——没有初始化=什么都没有。由于我必须编写代码的方式,所有数组都已初始化,但只有部分数组的长度>0。啊,我现在明白了。我会闭嘴,让那些知道他们在谈论什么的人(比如Derek)提供有用的信息。加速下一个循环的最简单方法是循环展开,但现在大多数编译器都会自动完成这项工作。拉出对循环静态的或多次使用的任何反引用,并避免任何装箱和取消装箱。下面是一篇关于.net托管代码优化和成本分析的好文章:@Aaron感谢您的回复(尽管是在我问这个问题两年后!):)。自从这篇文章以来,我读了很多关于优化的文章,但是专门研究一个数组是否为空,结果对于我庞大的数组来说太慢了。永远不会太晚!好吧,也许我应该看看问答日期;但它确实存在一些悬而未决的局部问题。你提出的解决方案或多或少是我最初的答案。基本上,当访问对象属性的成本太高时,可以使用更简单/更快的类型自己跟踪它。干杯
If cubes(threadnumber)(i).objects.Length > 0 Then
cubes(threadnumber)(i).objects = New Double() {}
End If