0

ループする〜137000レコードを含むエンティティのリストがあります。次に、これに含まれる追加パラメーターのタプルのリストにリンクする必要があります〜150000

なぜそれはより長くかかり続けるのですか、それはより多くの反復を行いますか?これがストップウォッチからのものです。見つかったもの:基準に一致する136770個のアイテム。

10,000個のアイテムが処理されましたEllapsedTime:5473つまり:0.0912166666666667分。

処理された20,000アイテムEllapsedTime:15307つまり:0.255116666666667分。

30,000アイテムが処理されましたEllapsedTime:30065つまり:0.501083333333333分。

50,000アイテムが処理されましたEllapsedTime:74507つまり:1.24178333333333分。

処理された75,000アイテムEllapsedTime:157836つまり:2.6306分。

処理された100,000アイテムEllapsedTime:272495つまり:4.54158333333333分。

EllapsedTime:499663つまり:8.32771666666667分。

これを最適化する方法はありますか?

 List<Entites> alMatched 
List<Tuple<int, double, int, int>> lsItems = new List<Tuple<int, double, int, int>>();
IEnumerable<Tuple<int, double, int, int>> enumThingy = lsItems;

 for (int z = 0; z <= alMatched.Count() - 1;z++ )
            {
               Entity a = alMatched[z];
               var newRepl = enumThingy.Where(d => d.First == a.ID).First();
               if (newRepl != null)
               {

               }

                switch (z)
                {
                    case 10000:
                        Debug.Print("10,000 items processed " + ElapsedTime(sw.ElapsedMilliseconds));
                        break;
                    case 20000:
                        Debug.Print("20,000 items processed " + ElapsedTime(sw.ElapsedMilliseconds));
                        break;
                    case 30000:
                        Debug.Print("30,000 items processed " + ElapsedTime(sw.ElapsedMilliseconds));
                        break;
                    case 50000:
                        Debug.Print("50,000 items processed " + ElapsedTime(sw.ElapsedMilliseconds));
                        break;
                    case 75000:
                        Debug.Print("75,000 items processed " + ElapsedTime(sw.ElapsedMilliseconds));
                        break;
                    case 100000:
                        Debug.Print("100,000 items processed " + ElapsedTime(sw.ElapsedMilliseconds));
                        break;
                }

            }

よろしく

_エリック

4

3 に答える 3

2

このコードを見てください:

for (int z = 0; z <= alMatched.Count() - 1;z++ )
{
    Entity a = alMatched[z];
    var newRepl = enumThingy.Where(d => d.First == a.ID).First();

この場合(そして私はあなたの「本当の」ケースだと思います)、enumThingyalMatched列挙型は両方とも同じ順序です。

このため、ケース1の場合、への呼び出しenumThingy.Whereは最初の反復で戻ります。ケース100の場合、条件に一致して終了するには100回の反復が必要です。ケース10000の場合、10000回の反復が必要です。

基本的に、遠くに行くほど、これは悪化します。アルゴリズムはO(N ^ 2)ですが、同じリストを使用しているため、LINQはショートカットであり、順序付けにより、どこからでも高速に「ショートカット」することができます。

于 2009-09-17T20:45:58.130 に答える
1

もちろん。リストの代わりに辞書を試してください

    List<Tuple<int, double, int, int>> lsItems = new List<Tuple<int, double, int, int>>();

//should be 

var lsItems = new Dictionary<int, Tuple<int, double, int, int>>();

/次のアイテムを参照します:

var newRepl = lsItems [a.ID];

于 2009-09-17T20:46:45.697 に答える
0

ここでは、さまざまなアプローチを使用して速度を上げることができます。

1つは、ハッシュテーブルを使用してアイテムをenumThingyに格納し、探しているキーでそれらにアクセスすることです。

もう1つのオプションは、enumthingeeを並べ替え、alMatchedを並べ替えてから、「スライドアプローチ」を使用して必要なすべてのアイテムを見つけることです。

現在、列挙型で作業しており、必要なアイテムを見つけるためにすべてのアイテムをチェックする必要があるため、チェーンの後半でアイテムが見つかる(または完全に欠落する)時間がますます長くなります。

于 2009-09-17T20:48:20.283 に答える