0

次のコードを使用して、文字列配列をコピーするための最速の方法を見つけようとしました。

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() ですが、完全に一貫しているわけではありません。あなたの経験は何ですか?最もよく使用するのはどれですか。その理由は何ですか。

4

1 に答える 1

1

Array.CopyToは単なるラッパーArray.Copyです。つまり、CopyTo本質的にこれを行います:

void CopyTo(Array dest, int length)
{
    Array.Copy(this, dest, length);
}

そのため、 (間接参照が 1 つ少ない)より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);

このような小さな配列の場合、1,000 回でも十分ではない可能性があります。意味のある違いがあるかどうかを確認するためだけに、100 万が必要になる場合があります。

また、これらのテストをデバッガーで実行すると、結果は無意味になります。必ずリリース モードでコンパイルし、デバッガーを切り離して実行してください。コマンド ラインから実行するか、Visual Studio で Ctrl+F5 を使用します。

于 2013-07-03T15:20:23.610 に答える