如果您想重置一个布尔值数组,哪个更快,重新引导数组或枚举和重置值?
我已经进行了一些测试,他们似乎认为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
答案 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
更快,因为您没有为数组的每个项目赋值。
微基准测试似乎没问题。