4

簡単に言えば。プロファイリング後、このコマンドは処理の 0.1% を占めます

var ChangesetList = TFSConnection.GetInstance().GetVersionControl().QueryHistory
    (Path, VersionSpec.Latest,0, RecursionType.Full, "", null, 
    VersionSpec.Latest, Int32.MaxValue,true, false);

これ、65,7%。(面白いことに、内部のすべての処理は 3% しか消費しません)

foreach (Changeset changeset in ChangesetList)

リストを取得するまでに数秒かかります... 何が起こっているのですか? リストの反復処理が遅いのはなぜですか?

これを行うより速い方法はありますか?

編集:さらに、直接変換できないのはなぜList<Changeset>ですか?

4

3 に答える 3

10

への呼び出しは をVersionControlServer.QueryHistory返すIEnumerableので、LINQ to Objects のようなものであり、IEnumerable を反復処理するとすぐに実際のクエリが実行されると仮定します (キーワード: 遅延実行)。

戻り値が の非ジェネリック バージョンであるため、結果を List に割り当てることはできませんIEnumerableCast<Changeset>()結果に対してorを呼び出すとOfType<Changeset>()、ジェネリックが返されます。IEnumerable<Changeset>.その後、呼び出しToList()て を取得できますList<Changeset>ToList()を繰り返し処理するIEnumerable<T>ため、foreach のようになり、ほとんどの時間がかかります。

前述のメソッドは拡張メソッドであり、System.Linq 名前空間にあります。

于 2011-03-01T13:56:30.030 に答える
4

QueryHistory はコレクションを遅延ロードします。つまり、反復処理を試行するまで、実際にはクエリを実行しません。

于 2011-03-01T13:49:14.433 に答える
1

ブール値の「変更を含める」には時間がかかります...変更を含めず、変更セットのメタデータのみを含める場合、クエリは非常に高速です

したがって、クエリは次のようになります。

var ChangesetList = TFSConnection.GetInstance().GetVersionControl().QueryHistory     (Path, VersionSpec.Latest,0, RecursionType.Full, "", null, VersionSpec.Latest, Int32.MaxValue,**false,** false); 
于 2012-08-02T09:49:51.447 に答える