代码之家  ›  专栏  ›  技术社区  ›  Maxim Gershkovich

redim布尔数组vs枚举和设置

  •  4
  • Maxim Gershkovich  · 技术社区  · 16 年前

    如果要重置布尔值数组,那么重新指定数组或枚举并重置值的速度更快些?

    我做过一些测试,他们似乎认为Redim速度要快得多,但我不相信这不是我运行测试的结果。

    我的测试似乎表明Redim的速度快了近两倍。

    那么,有谁愿意评论哪种速度更快,为什么呢?另外,您希望不同语言的结果相同吗?

    EnUM试验:

    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
    

    Redim Test:

    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 回复  |  直到 16 年前
        1
  •  2
  •   Jon Skeet    16 年前

    这表明分配新数组很快。当有足够的内存可用时,这是可以预料的——基本上是增加一个指针和一点点的内务管理。

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

    一个更合适的测试可能是调用 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 )根本不更改现有数组。

        2
  •  1
  •   shahkalpesh    16 年前

    这些测试是不可比的。
    第一个测试将每个元素设置为true,而 Redim 不这样做。

    重新定义 帮助您增加/减少边界并清除内容(并将其设置为默认值)。 例如 重新定义 将帮助设置 boolean 数组设置为false。

    你在等吗 重新定义 将所有元素设置为 true ?

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

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

    如果要保留内容,请增大大小- Redim Preserve booleanArray(300) 而不是 Redim booleanArray(200) )这将使前200个元素 新的100个元素将有默认值( )

        3
  •  1
  •   dotcoder    16 年前

    我用C语言3.5测试过这个。

    枚举测试所用时间:00:00:06.2656 Redim测试时间:00:00:00.0625000

    如你所见,Redim的速度要快得多,因为你没有设置任何值。

        4
  •  0
  •   Oded    16 年前

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

    微基准显示正常。