Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 检查数组是否为空的最快方法_Arrays_Vb.net_Performance_Optimization - Fatal编程技术网

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

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会快

我想知道在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亿次

另外,如果有人知道如何加快…下一个循环,那也太好了

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