0

私はいくつかのレガシーコードを更新することを任されており、その一部の実行時間を本当に短縮する必要があります. 以下のリストはかなり頻繁に読み込まれます。時間を約 1 分から約 15 秒に短縮することができましたが、実際にはさらに短縮する必要があります。次のコード行はかなりうまく機能しますが、できる限りのことを絞り出そうとしています。

List<MyObject> _moList = new List<MyObject>(DB.GetAll(queryString, parameters, MyObject.Extract));
_moList.AsParallel().ForAll(s => s.RelativeCost = GetRelativeCost(s));

いくつか質問があります。まず、これらの 2 つの行を 1 つの行に結合することは可能ですか。第二に、これを行うとパフォーマンスがまったく向上しますか?

MyObject には約 40 個のプロパティがあり (それが適切かどうかは不明)、GetRelativeCost は時間/CPU サイクルに関してはやや高価です (したがって、並列実行)。

どんな助けでも大歓迎です!

PS私は他の角度からも取り組んでおり、特にGetRelativeCostの「コスト」を削減しようとしていますが、ユーザーに受け入れられるようにするために、これから取得できるすべてのサイクルを取得する必要があります。

4

2 に答える 2

1
  1. プロファイラーを実行しましたか?ボトルネックを最適化していますか?
  2. ではなくリスト処理を最適化しようとしているのはなぜGetRelativeCostですか?
  3. とはDB.GetAll? 最適な方法で機能していると確信していますか?
  4. MyObject.Extractある種のオブジェクト水和機能が正しいと思いますか? 最適だと確信していますか?
  5. GetRelativeCostリストの読み込み時に実行されるのはなぜですか? その実行を遅らせることは理にかなっているでしょうか?

最後のポイントについて詳しく説明します。GetRelativeCost何らかの副作用がある場合は、DRY の原則に違反しているため、とにかく削除することをお勧めします。そうでない場合は、次RelativeCostのように遅延初期化を許可するように書き直すことをお勧めします。

private int? _relativeCost
public int RelativeCost {
    get {
       if  (!_relativeCost.HasValue)
            _relativeCost = GetRelativeCost();
       return _relativeCost;
    }
}

GetRelativeCostこのようにして、本当に必要になるまで実行を遅らせます。GetRelativeCostこのようにして、実際には設定する必要のないエンティティを計算しないことで最適化するだけでなく、後で計算を増やすという犠牲を払ってコストのかかる計算を遅らせることで、その特定のコードRelativeCostを高速化します。GetRelativeCost

要約すると、プロファイラーを実行し、ボトルネックを特定し、ボトルネックを最適化ます。ボトルネックが発生しているように見える場合は、GetRelativeCost上で説明したように遅延させてみてください。

于 2013-03-11T21:29:49.613 に答える
0

変数を削除し、newの結果でAsParalelを呼び出すことにより、これらを1行にまとめることができます。

(new List<MyObject>(DB.GetAll(queryString, parameters, MyObject.Extract))).AsParallel().ForAll(s => s.RelativeCost = GetRelativeCost(s));

ただし、これによってコードのパフォーマンスが向上するとは思わないでください。

于 2013-03-11T21:24:52.360 に答える