5

linq を広範囲に使用する大規模なアプリを最適化する必要があります。linq ステートメントの多くは、linq 拡張メソッド内で匿名オブジェクトを作成します。例 :-

// custom sort order
var sortedData = data.OrderBy(x => (new List<string>() {"Orange", "Apple", "Pear" }).IndexOf(x.Name));
foreach (var d in sortedData) {
    ....

問題は、反復ごとに新しいリストが作成されることです。

コンパイラーに静的分析を実行させ、ループ不変コードを抽出してループの外に出すように設定できるコンパイラー・フラグはありますか?

4

5 に答える 5

1

多くの人が例によってあなたの注文に巻き込まれ、あなたの本当の質問を逃したと思います。

これを静的に(プログラムを実行せずに)実行できるVisualStudioに組み込まれた単純なツールはありません。プログラムを実行して問題のコードを実行できる場合に役立つツールが2つあります(100%のコードカバレッジを持つ単体テストがありますね;))。1つはVisualStudioに組み込まれているプロファイラーで、もう1つはCLRプロファイラーです。

私はCLRプロファイラーを使用したことがなく、VisualStudioにあるものの古いバージョンである可能性があります。Visual Studioプロファイラーは、多数のオブジェクト(例ではリスト)が作成されているかどうかを示し、コード内のどこでそれらのオブジェクトが作成されているかを確認できます。また、実行に最も時間がかかるコード行を表示できるため、プログラムを高速化するためにどこに集中するかを知ることができます。

プロファイラーの実行で特定の問題が発生した場合は、その問題について新しい質問を開くことをお勧めします。

于 2012-12-13T15:07:04.133 に答える
1

なんで自分で引き出せないの?

var fruits = new [] {"Orange", "Apple", "Pear" };
var sortedData = data.OrderBy(x => fruits.IndexOf(x.Name));
foreach (var d in sortedData) {

さらに、これらのループがすべて同じクラスにある場合は、そのクラスfruitsstatic readonlyメンバーを作成します。

于 2012-12-13T14:25:27.257 に答える
0

LINQ を次のように変更できます。

// Note the call to ToArray()
var sortedData = data.OrderBy(...).ToArray();

その場合、ステートメントは 1 回実行する必要があり、ループのソースは一定になります。

于 2012-12-13T14:20:48.400 に答える
0

これを自動的に修正するように設定できるものはありません。匿名オブジェクトを手動で取り出す必要があります。

var orderingList = new List<string>() { "Orange", "Apple", "Pear" };
var sortedData = data.OrderBy(x => orderingList.IndexOf(x.Name));
foreach (var d in sortedData) {
    ...
}

の各アイテムのリストを反復処理する必要があるため、これはリストを順序付ける最も効率的な方法ではないことに注意してくださいdata。あなたは辞書を使ったほうがいいでしょう:

var ordering = new Dictionary<string, int> {
    {"Orange", 0}, {"Apple", 1}, {"Pear", 2} };
var sortedData = data.OrderBy(x => ordering.ContainsKey(x) ? ordering[x] : -1);
于 2012-12-13T14:25:37.263 に答える
-1

FxCop のルールを確認してください。何かできることがあるかもしれません。

于 2012-12-13T14:30:52.933 に答える