Redim boolean Array vs enumerate and set

时间:2010-07-23 07:28:25

标签: vb.net arrays optimization

如果您想重置一个布尔值数组,哪个更快,重新引导数组或枚举和重置值?

我已经进行了一些测试,他们似乎认为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

4 个答案:

答案 0 :(得分:2)

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

但是,请注意,这将创建一个新数组,其中所有元素都为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, 0, 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)根本不会更改现有数组。

答案 1 :(得分:1)

测试无法比较 第一个测试将每个元素设置为true,而Redim不会这样做。

Redim可帮助您增加/减少界限&amp;清理内容(并将其设置为默认值)。 例如Redim有助于将boolean数组的内容设置为false。

您是否希望Redim将所有元素设置为true

Dim booleanArray(200) As Boolean

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

Redim booleanArray(200)

这会将booleanArray的每个元素的内容重置为false

如果您想保留内容&amp;增加尺寸 - Redim Preserve booleanArray(300)(而不是Redim booleanArray(200))。这会将前200个元素保留为true,而新的100个元素将具有默认值(false)。

答案 2 :(得分:1)

我已在C#语言3.5

中对此进行了测试

Enum测试所用的时间:00:00:06.2656 Redim测试所用时间:00:00:00.0625000

正如您所看到的,Redim要快得多,因为您没有为其设置任何值。

答案 3 :(得分:0)

我希望ReDim更快,因为您没有为数组的每个项目赋值。

微基准测试似乎没问题。