-8

quandry は - 次の 2 つの方法のどちらが最も優れたパフォーマンスを発揮する か
です 。レコード数 - 約 1000 ~ 約 2000、最大約 6K 選択肢 - オンザフライでオブジェクトを作成するか、辞書からルックアップを 実行 実行速度 - 毎秒 x 回呼び出される



注意 - 最初に動作するコードを提供してから最適化を行う必要があるため、理論家が舞台裏の情報を垣間見ることができれば、おそらく eod thu までに実際のパフォーマンス テストに進む前に役立つでしょう。

定義 -

class Wrapper  
{  
   public readonly DataRow Row;  
   public Wrapper(DataRow dr)  
   {  
      Row = dr;  
   }  
   public string ID { get { return Row["id"].ToString(); } }  
   public string ID2 { get { return Row["id2"].ToString(); } }  
   public string ID3 { get { return Row["id3"].ToString(); } }  
   public double Dbl1 { get { return (double)Row["dbl1"]; } }  
   // ... total about 12 such fields !  
}  
Dictionary<string,Wrapper> dictWrappers;  

方法 1

Wrapper o = new Wrapper(dr);  
/// some action with o
myMethod( o );

方法 2

Wrapper o;    
if ( ! dictWrappers.TryGetValue( dr["id"].ToString(), out o ) )    
{    
    o = new Wrapper(dr);    
    dictWrapper.Add(o.ID, o);    
}    

/// some action with o    
myMethod( o );    
4

5 に答える 5

7
  1. 最初にプロファイリングせずに最適化しないでください。
  2. コードが仕様/期待を満たさない限り、プロファイリングしないでください。
  3. このコードをプロファイリングする必要がある場合は、両方の方法で記述し、予想される負荷でベンチマークします。

編集:パフォーマンスが許容できない場合を除き、最適化よりも次のことを優先しようとします:

  • シンプルさ
  • 可読性
  • 保守性
  • テスト容易性

私は (最近) デバッグが非常に困難な高度に最適化されたコードを見てきました。単純化するためにリファクタリングしてから、パフォーマンス テストを実行しました。パフォーマンスは許容できないものだったので、プロファイルを作成し、ボトルネックを見つけて、それらだけを最適化しました。パフォーマンス テストを再実行したところ、新しいコードは高度に最適化されたバージョンと同等でした。そして、メンテナンスがはるかに簡単になりました。

于 2009-10-06T01:08:19.277 に答える
5

無料のプロファイリング ツールを次に示します。

于 2009-10-06T01:14:34.437 に答える
2

最初のものは、実際にはルックアップを行っていないため、より高速です。単純な割り当てと割り当てを行っているだけです。

コードの 2 つのセグメントはほぼ同等ではありません。ただし、機能的には、方法 1 では多くの重複が作成される可能性があるためです。

于 2009-10-06T01:15:08.210 に答える
0

実際にテストしなくても、Wrapper でフィールド値をキャッシュする (つまり、すべての ToString 呼び出しとキャストを回避する) と、おそらくパフォーマンスにより多くの影響があると思います。

これらの値をキャッシュしたら、Wrapper のインスタンスを頻繁に再作成するのではなく、保持したいと思うでしょう。

于 2009-10-06T01:23:53.450 に答える
0

per について本当に心配していると仮定すると(ちょっと、それが起こる)、基礎となるラッパー自体を改善することができます。文字列によるフィールド検索を行っています。行に設定された同じフィールドで何度も呼び出しを行う場合は、序数をキャッシュして序数で検索する方が実際には高速です。

もちろん、これは本当に本当にパフォーマンスを心配する必要がある場合に限られ、これが違いを生む例はかなりまれです (ただし、組み込みデバイスではデスクトップほどまれではありません)。

于 2009-10-06T01:24:46.023 に答える