2017-06-22 12 views
1

どうすれば改善できますか?ドットトレースプロファイル、なぜメモリフェッチが遅いとフラグされている

プロファイルがリストからデータをフェッチする

public List<RowDataDto> Rows { get; set; } 

public RowDataDto GetRow(int rowNdx) 
{ 
     var row = Rows.SingleOrDefault(x => x.LineNumber == rowNdx); 
     return row; 
} 

リストは平均で1000件の周りに含まれています遅いことを示唆しているイムだけでどのようにそれをパフォーマンスを見ることがbenchmaching。

その最も遅い部分はメモリリストからの取り出しです。

GetRowが呼び出される前に、十分に行が設定されます。

LINENUMBERはINT32

PSである - 私はちょうどので、私は適切なツールを使用する方法を理解できない場合があり、それに非常に新しいドットトレースとIMをインストールしました。私は簡単なテストをしています。私は "Net Process"を起動してテストを実行し、ある時点でスナップショットを取得します。

このツールを使用したことがある場合は、事前に教えてください。

dot trace profile

+1

リスト内の1000個のアイテムを検索するのは大したことではありませんが、パフォーマンスが重要な要素であれば、私はいくつかの変更を行います。まず、ラムダ式の使用頻度を、メソッド。第二に、Linqを使用する代わりに、または少なくともforeachを使用してください –

+0

ヒープクロージャを持つラムダ式は、GCの点で悪です。私は過去にパフォーマンスの最適化のために多くの問題を抱えていた –

+0

@VahidKあなたが意味するものの例を私に見せてくれますか? – Seabizkit

答えて

0

あなたは、メモリ内のリストを持っていて、特定のルックアップにそれに多くの時間を実行する場合 - それは、リストの代わりに辞書を使用することをお勧めします。あなたがする必要がある場合は、使いやすさのためには、その辞書の値の読み取り専用コレクションを公開することができる(それが公共のメンバーとして辞書を公開するために通常は良いではありません):

private Dictionary<int, RowDataDto> _rows; 
public IReadOnlyCollection<RowDataDto> Rows {get {return _rows.Values;}} 

public RowDataDto GetRow(int rowNdx) 
{ 
    var row = _rows.ContainsKey(rowNdx) ? _rows[rowNdx] : null; 
    return row; 
} 

SingleOrDefaultを使用すると、まれに良好であることに注意してください。リストに重複が含まれていないと思われる場合は、FirstOrDefaultを使用してください。 SingleOrDefaultは、重複がないことを保証するためにリスト全体を調べなければなりません。重複がない場合は、常にリスト全体を通過します。

関連する問題