1

コードベースの履歴を見て、これから変更されたチェックインを見つけました。

    public virtual T[] ToArray()
    {
        List<T> list = new List<T>();
        foreach (object item in List)
        {
            list.Add((T)item);
        }

        return list.ToArray();
    }

これに:

    public virtual T[] ToArray()
    {
        T[] result = new T[List.Count];
        for (int i = 0; i < List.Count; ++i)
        {
            result[i] = (T)List[i];
        }

        return result;
    }

コメント付き:プロセスで複数のデータ構造を作成しないように最適化されたToArray実装。

なぜここに最適化があるのだろうか。for()よりも速いかもしれませんがforeach()、「複数のデータ構造の作成」はどこにありますか?

P / S:これを書いた人は今休暇中です

4

3 に答える 3

9

元のコードではList<T>、容量を指定せずに-を作成するため、内部配列を数回コピーする必要があります-次に、を呼び出すとToArrayList<T>コピーが作成されます。

新しいバージョンはそれを行いません。1つの配列を作成し、元のリストをその配列にコピーします。

確かに、LINQのToArrayメソッドを使用するだけの方が簡単で、おそらくさらに効率的であり、これが最初から仮想メソッドである理由は明らかではありませんが...

于 2012-09-12T02:02:10.610 に答える
3

最初の実装では、仲介者の追加のListオブジェクトを作成します。GCがクリーンアップするのはもう1つだけです。このルーチンが非常に高いレベルでヒットしない限り、この最適化はほぼ確実に目立たなくなります。

foreachそれ以外の場合は、またはを使用するかどうかとは関係ありませんfor。その選択は主に、リストが列挙されている間は変更できないという規則によって動機付けられました。

于 2012-09-12T02:05:50.037 に答える
0

リストを配列に変換するためのさらに高速なパフォーマンスのために、HPCsharp nugetパッケージはList.ToArray()の並列(マルチコア)バージョンを実装します。

public virtual T[] ToArray()
{
    return List.ToArrayPar();
}

このメソッドは必要ありませんが、配列が必要な場合は常にList.ToArrayPar()関数を使用してください。この並列バージョンは、List.ToArray()よりも約3倍高速です。

于 2019-09-03T03:12:25.773 に答える