4

List<T>配列に逆方向にコピーできるようにしたいということがあります。つまり、List.Countリストの最後から5つのアイテムを開始してコピーし、逆方向に作業します。単純な逆forループでこれを行うことができます。ただし、これを行うためのより高速で効率的な方法がおそらくあるので、質問する必要があると思いました。Array.Copyなんとか使えないかな?

もともと私はQueue必要な正しい順序でポップオフする as を使用していましたが、今では複数のアイテムを一度に配列にポップオフする必要があり、リストの方が速いと思いました。

4

4 に答える 4

3

配列を逆にするためのネイティブコードがあるように見えArray.Reverseますが、これは適用されない場合があり、単純なforループの使用にフォールバックします。私のテストArray.Reverseでは、単純なforループよりもわずかに高速です。1,000,000個の要素配列を1,000回反転するこのテストでArray.Reverseは、約600ミリ秒ですが、forループは約800ミリ秒です。

ただし、使用する理由としてパフォーマンスはお勧めしませんArray.Reverse。これは非常に小さな違いであり、ロードするとすぐに失われList、配列を再びループします。とにかく、アプリのプロファイルを作成してパフォーマンスのボトルネックを特定するまでは、パフォーマンスについて心配する必要はありません。

    public static void Test()
    {
        var a = Enumerable.Range(0, 1000000).ToArray();

        var stopwatch = Stopwatch.StartNew();

        for(int i=0; i<1000; i++)
        {
            Array.Reverse(a);
        }

        stopwatch.Stop();

        Console.WriteLine("Elapsed Array.Reverse: " + stopwatch.ElapsedMilliseconds);

        stopwatch = Stopwatch.StartNew();

        for (int i = 0; i < 1000; i++)
        {
            MyReverse(a);
        }

        stopwatch.Stop();

        Console.WriteLine("Elapsed MyReverse: " + stopwatch.ElapsedMilliseconds);
    }

    private static void MyReverse(int[] a)
    {
        int j = a.Length - 1;
        for(int i=0; i<j; i++, j--)
        {
            int z = a[i];
            a[i] = a[j];
            a[j] = z;
        }
    }
于 2010-04-26T03:17:24.420 に答える
1

forこれを単純なループよりも速く行うことはできません。

于 2010-04-26T03:01:39.843 に答える
0

あなたのコメントの1つで:

現在、1つの結果を引き出し、一度に1つずつデータベースにコミットしています。

ループを使用してaを逆方向に反復することと、レコードを一度に1つずつデータベースにコミットすることには大きな違いがあります。前者は問題ありません。後者を支持する人は誰もいません。forList<T>

最初に繰り返して(配列にデータを入力する)、次にその配列をデータベースに送信して、すべて入力したのではないでしょうか。

var myArray = new T[numItemsYouWantToSend];

int arrayIndex = 0;
for (int i = myList.Count - 1; arrayIndex < myArray.Length; --i) {
    if (i < 0) break;
    myArray[arrayIndex++] = myList[i];
}

UpdateDatabase(myArray);
于 2010-04-26T03:26:04.490 に答える
0

さまざまな方法で実現できますが、最速の方法は、要素をそのままの方法で取得することです。Array.Reverse、Array.Copy などを使用することも、LINQ と拡張メソッドを使用することもできます。どちらも有効な代替手段ですが、より高速になることはありません。

于 2010-04-26T03:02:09.623 に答える