好的,让我们来看看关于这个问题的性能问题。这不是一个答案,只是一个微基准,看看哪个选项更有效。
所以,让我们设置场景:
- 包含 1,000,000 个项目的字节数组,随机填充
- 我们需要添加项目 0x00
我们有 3 个选项:
- 手动创建和填充新数组
- 手动创建新数组并使用 Array.Copy (@Monroe)
- 创建列表、加载数组、插入项目并将列表转换为数组
这是代码:
byte[] byteArray = new byte[1000000];
for (int i = 0; i < byteArray.Length; i++)
{
byteArray[i] = Convert.ToByte(DateTime.Now.Second);
}
Stopwatch stopWatch = new Stopwatch();
//#1 Manually creating and populating a new array;
stopWatch.Start();
byte[] extendedByteArray1 = new byte[byteArray.Length + 1];
extendedByteArray1[0] = 0x00;
for (int i = 0; i < byteArray.Length; i++)
{
extendedByteArray1[i + 1] = byteArray[i];
}
stopWatch.Stop();
Console.WriteLine(string.Format("#1: {0} ms", stopWatch.ElapsedMilliseconds));
stopWatch.Reset();
//#2 Using a new array and Array.Copy
stopWatch.Start();
byte[] extendedByteArray2 = new byte[byteArray.Length + 1];
extendedByteArray2[0] = 0x00;
Array.Copy(byteArray, 0, extendedByteArray2, 1, byteArray.Length);
stopWatch.Stop();
Console.WriteLine(string.Format("#2: {0} ms", stopWatch.ElapsedMilliseconds));
stopWatch.Reset();
//#3 Using a List
stopWatch.Start();
List<byte> byteList = new List<byte>();
byteList.AddRange(byteArray);
byteList.Insert(0, 0x00);
byte[] extendedByteArray3 = byteList.ToArray();
stopWatch.Stop();
Console.WriteLine(string.Format("#3: {0} ms", stopWatch.ElapsedMilliseconds));
stopWatch.Reset();
Console.ReadLine();
结果是:
#1: 9 ms
#2: 1 ms
#3: 6 ms
我已经运行了多次,得到的数字不同,但比例始终相同:#2 始终是最有效的选择。
我的结论:数组比列表更有效(尽管它们提供的功能较少),并且以某种方式Array.Copy
真正优化了(尽管想理解这一点)。
任何反馈将不胜感激。
此致。
PS:这不是一个剑术帖子,我们在一个问答网站学习和教学。并学习。