【问题标题】:Fastest method to check if an array is empty检查数组是否为空的最快方法
【发布时间】:2012-11-22 05:12:43
【问题描述】:

我想知道在 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 托管代码优化和成本分析的好文章:msdn.microsoft.com/en-us/library/ms973852.aspx
  • @Aaron 感谢您的回复(尽管在我问这个问题 2 年后!):)。自从这篇文章以来,我已经阅读了很多关于优化的内容,但特别是查看数组是否为空对于我的大量数组来说太慢了。
  • 永远不会太晚!好的,也许我应该看看问答日期;但它确实有突出的部分问题。您提出的解决方案或多或少将成为我的初步答案。基本上,当访问对象属性的成本太高时,请以更简单/更快的类型自行跟踪它。干杯。

标签: arrays vb.net performance optimization


【解决方案1】:

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 不是多维数组(例如 List),您应该将 cubes(threadnumber) 代码从循环中取出。

更新

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

This是我使用的测试代码。

【讨论】:

    【解决方案2】:
    if myarray is nothing then...
    

    if myarray isnot nothing then...
    

    【讨论】:

    • 嗯,我刚刚又读到你的问题,这可能不是你想要的信息。对不起。
    • 感谢您的回复,但是是的,主要问题是到处都建议检查它是否没有被初始化而不是为空。感谢您的尝试:)
    • 我的理解是,如果没有初始化就相当于VB.NET“什么都没有”。但老实说,我不确定你到底想要完成什么。
    • 这也是我的理解 - 未初始化 = 没有。由于我必须编写所有数组的编码方式,所有数组都已初始化,但只有其中一些数组的长度 > 0。
    • 啊,我明白了。我会闭嘴,让知道他们在说什么的人(比如 Derek)提供有用的信息。
    【解决方案3】:

    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
    

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2016-08-28
        • 2018-11-14
        • 1970-01-01
        • 2014-07-12
        • 2010-12-20
        • 1970-01-01
        • 2013-02-18
        • 1970-01-01
        • 2018-05-04
        相关资源
        最近更新 更多