加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

vb.net – Redim boolean Array vs enumerate and set

发布时间:2020-12-17 07:14:25 所属栏目:百科 来源:网络整理
导读:如果您想重置一个布尔值数组,哪个更快,重新定位数组或枚举和重置值? 我已经进行了一些测试,他们似乎认为redim要快得多,但我不相信它不是我运行测试的结果. 我的测试似乎表明redim几乎快了两倍. 所以有人可以关注哪个更快,为什么?您是否也期望在不同语言中
如果您想重置一个布尔值数组,哪个更快,重新定位数组或枚举和重置值?

我已经进行了一些测试,他们似乎认为redim要快得多,但我不相信它不是我运行测试的结果.

我的测试似乎表明redim几乎快了两倍.

所以有人可以关注哪个更快,为什么?您是否也期望在不同语言中获得相同的结果?

枚举测试:

Dim booleanArray(200) As Boolean

        Dim startTime As Date = Date.Now

        For i As Integer = 0 To 9999999
            For l As Integer = 0 To 200
                booleanArray(l) = True
            Next
        Next

        Dim endTime As Date = Date.Now

        Dim timeTaken As TimeSpan = endTime - startTime

重新测试:

Dim booleanArray(200) As Boolean

        Dim startTime As Date = Date.Now

        For i As Integer = 0 To 9999999
            ReDim booleanArray(200)
        Next

        Dim endTime As Date = Date.Now

        Dim timeTaken As TimeSpan = endTime - startTime

解决方法

这表明分配新阵列很快.当有足够的可用内存时,这是可以预期的 – 基本上它会增加一个指针和一小部分内务.

但请注意,这将创建一个新数组,其中所有元素都为False而不是True.

更合适的测试可能是在现有阵列上调用Array.Clear,在第一种情况下,这将很快消除内容.

请注意,您的第二个表单将创建更多垃圾 – 在这种情况下,它将始终保留在gen0中并且可以轻松收集,但在具有更实际内存使用的实际应用程序中,您最终可能会通过创建新数组导致垃圾收集性能问题而不是清除旧的.

这是C#中的一个快速基准测试,它测试了三种策略:

using System;
using System.Diagnostics;

public class Test
{
    const int Iterations = 100000000;

    static void Main()
    {
        TestStrategy(Clear);
        TestStrategy(ManualWipe);
        TestStrategy(CreateNew);
    }

    static void TestStrategy(Func<bool[],bool[]> strategy)
    {
        bool[] array = new bool[200];
        GC.Collect();
        GC.WaitForPendingFinalizers();
        Stopwatch sw = Stopwatch.StartNew();
        for (int i = 0; i < Iterations; i++)
        {
            array = strategy(array);
        }
        sw.Stop();
        Console.WriteLine("{0}: {1}ms",strategy.Method.Name,(long) sw.ElapsedMilliseconds);
    }

    static bool[] Clear(bool[] original)
    {
        Array.Clear(original,original.Length);
        return original;
    }

    static bool[] ManualWipe(bool[] original)
    {
        for (int i = 0; i < original.Length; i++)
        {
            original[i] = false;
        }
        return original;
    }

    static bool[] CreateNew(bool[] original)
    {
        return new bool[original.Length];
    }
}

结果:

Clear: 4910ms
ManualWipe: 19185ms
CreateNew: 2802ms

然而,这仍然只是使用第0代 – 我个人认为Clear对于整体应用程序性能更好.请注意,如果任何其他代码引用了原始数组,它们的行为会有所不同 – “创建新”策略(ReDim)根本不会更改现有数组.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读