我试图找出使用此代码复制字符串数组的最快方法:
static void Main(string[] args)
{
Stopwatch copy = new Stopwatch();
Stopwatch copyTo = new Stopwatch();
Stopwatch direct = new Stopwatch();
Stopwatch clone = new Stopwatch();
string[] animals = new string[1000];
animals[0] = "dog";
animals[1] = "cat";
animals[2] = "mouse";
animals[3] = "sheep";
for (int i = 4; i < 1000; i++)
{
animals[i] = "animal";
}
copy.Start();
string[] copyAnimals = new string[animals.Length];
Array.Copy(animals, copyAnimals, animals.Length);
copy.Stop();
Console.WriteLine("Copy: " + copy.Elapsed);
copyTo.Start();
string[] copyToAnimals = new string[animals.Length];
animals.CopyTo(copyToAnimals, 0);
copyTo.Stop();
Console.WriteLine("Copy to: " + copyTo.Elapsed);
direct.Start();
string[] directAnimals = new string[animals.Length];
directAnimals = animals;
direct.Stop();
Console.WriteLine("Directly: " + direct.Elapsed);
clone.Start();
string[] cloneAnimals = (string[])animals.Clone();
clone.Stop();
Console.WriteLine("Clone: " + clone.Elapsed);
}
在大多数情况下,最快的排名是:CopyTo(),Clone(),Directly,Copy(),但它并不是绝对一致的。你有什么经历?你最常用的是哪一个?为什么?
答案 0 :(得分:1)
Array.CopyTo
只是Array.Copy
的包装。也就是说,CopyTo
基本上就是这样:
void CopyTo(Array dest, int length)
{
Array.Copy(this, dest, length);
}
因此,Copy
会比CopyTo
稍微更快(少一个间接)。
您的直接副本实际上并不复制数组。它只是复制参考。也就是说,鉴于此代码:
string[] directAnimals = new string[animals.Length];
directAnimals = animals;
如果您随后撰写animals[0] = "Penguin";
,则directAnimals[0]
也会包含值"Penguin"
。
我怀疑Clone
与Array.Copy
相同。它只是分配一个新数组并将值复制到它。
关于时间安排的一些注意事项:
您的测试工作太少,无法准确计算时间。如果您需要有意义的结果,则必须多次执行每个测试。类似的东西:
copyTo.Start();
for (int i = 0; i < 1000; ++i)
{
string[] copyToAnimals = new string[animals.Length];
animals.CopyTo(copyToAnimals, 0);
}
copyTo.Stop();
Console.WriteLine("Copy to: " + copyTo.Elapsed);
对于这样的小阵列,1000次甚至可能不够。你可能需要一百万只才能看出是否存在任何有意义的差异。
另外,如果在调试器中运行这些测试,结果将毫无意义。确保在发布模式下编译并在分离的调试器下运行。可以从命令行执行,也可以在Visual Studio中使用Ctrl + F5。