如果您想重置一个布尔值数组,哪个更快,重新定位数组或枚举和重置值? 我已经进行了一些测试,他们似乎认为redim要快得多,但我不相信它不是我运行测试的结果. 我的测试似乎表明red
我已经进行了一些测试,他们似乎认为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, 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)根本不会更改现有数组.