2

多次元C#配列を反復処理するための最速の方法を見つけようとしています。問題に焦点を当てるために、すべてのドメインコードを削除しました。現時点では、これは1.86秒で実行され、その間に約25,000,000回の反復を実行し、5000個の配列要素を処理します。私は2日間で1.86をできるだけ下げるという目標を設定しています:-)

現実の世界では、処理するのに50,000²のようになります。

PLINQを使用してみましたが、スレッドのオーバーヘッドによって実際には遅くなっているようです(3.48秒で発生します)。

安全でないC#が進むべき道かもしれないと思っていますが、その道を進む前に、パフォーマンスを改善する方法について何か考えていただければ幸いです。これまでに安全でないC#を実行したことがないので、パフォーマンスが向上するかどうかはわかりません。

Console.WriteLine("started");
        var sw = System.Diagnostics.Stopwatch.StartNew();
        long iterations = 0;
        string[] data = new string[5000];
        string[] data2 = new string[5000];
        string[] data3 = new string[5000];

        int ubound = data.GetUpperBound(0);
        for (int i = 0; i <= ubound; i++)
        {
            string d1 = data[i];
            string d2 = data2[i];
            string d3 = data3[i];

            for (int j = 0; j < ubound; j++)
            {
                string e1 = data[j];
                string e2 = data2[j];
                string e3 = data3[j];
                Interlocked.Increment(ref iterations);
            }

            Interlocked.Increment(ref iterations);
        }
        Console.WriteLine("Finished {0} iterations in {1} seconds", iterations, sw.Elapsed.TotalSeconds);
4

2 に答える 2

0

多次元配列の代わりに、フラット配列を選び、数学を使用してそれに対処します。

Console.WriteLine("started");
var sw = System.Diagnostics.Stopwatch.StartNew();
long iterations = 0;

var width=5000;
var height=3;
string[] data = new string[width*height];
for (int i = 0; i < width; i++)
{
    string d1 = data[i];
    string d2 = data[width+i];
    string d3 = data[width*2+i];

    for (int j = 0; j < width; j++)
    {
        string e1 = data[j];
        string e2 = data[width+j];
        string e3 = data[width*2+j];
        Interlocked.Increment(ref iterations);
    }
    //});

    Interlocked.Increment(ref iterations);
}
Console.WriteLine("Finished {0} iterations in {1} seconds", iterations, sw.Elapsed.TotalSeconds);
于 2012-08-09T21:18:41.440 に答える
0

実際の問題を表すためにInterlocked.Increment()呼び出しが必要ですか?作成したコードから、これらの呼び出しに最も多くの時間がかかる可能性があります。ローカル変数の反復へのマルチスレッドアクセスがないため、呼び出しをなくすことができます。

于 2012-08-09T22:47:53.477 に答える