C#パフォーマンスの質問
-
19-09-2019 - |
質問
ゆがみは - 次の2つの方法のどれが最もパフォーマンスがありますか
目標 - タイプラッパーのオブジェクトを取得します(以下に定義)
基準 - ストレージの速度
番号。記録の - 約1000〜2000、最大約6k
選択 - その場でオブジェクトを作成するか、辞書からルックアップを実行します
実行速度-1秒あたりのX時間と呼ばれます
NB-最初に作業コードを配信してから最適化に進む必要があります。したがって、理論家が舞台裏情報を垣間見ることができる場合は、おそらく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 );
解決
最初のものはより速くなります。実際にはルックアップを行っていないため、単純な割り当てと割り当てを行うだけです。
コードの2つのセグメントは、ほぼ同等ではありません。ただし、機能では、方法1が多くの複製を作成できるためです。
他のヒント
- 最初にプロファイリングせずに最適化しないでください。
- コードが仕様/期待を満たさない限り、プロファイルしないでください。
- このコードをプロファイルする必要がある場合は、両方の方法を書き込み、予想される負荷でベンチマークしてください。
編集:パフォーマンスが受け入れられない限り、最適化よりも以下を支持しようとします。
- シンプルさ
- 読みやすさ
- 保守性
- テスト可能性
私は(最近)デバッグが非常に困難な非常に最適化されたコードを見ました。私はそれを単純化するためにそれをリファクタリングし、その後パフォーマンステストを実行しました。パフォーマンスは受け入れられなかったので、私はそれをプロファイルし、ボトルネックを見つけ、それらのみを最適化しました。パフォーマンステストを再実行し、新しいコードは高度に最適化されたバージョンに匹敵しました。そして、今では維持がはるかに簡単になりました。
これが無料です プロファイリングツール.
実際にテストしないと、ラッパーのフィールド値をキャッシュすること(つまり、すべてのトストリングコールとキャストを避ける)は、おそらくパフォーマンスに大きな影響を与えると予想されます。
その後、これらの値をキャッシュすると、頻繁に再作成するのではなく、ラッパーのインスタンスを維持したいと思うでしょう。
あなたがそうだと仮定して 本当 PER(ねえ、それが起こる)を心配して、あなたの根底にあるラッパー自体が改善される可能性があります。あなたは文字列ごとにフィールドルックアップをしています。同じフィールドが行に設定されている場合、コールをたくさん行う場合は、実際には序数をキャッシュして順序で検索する方が速いです。
もちろん、これは本当にパフォーマンスを心配する必要がある場合にのみ、これが違いを生むインスタンスはかなりまれです(埋め込まれたデバイスでは、デスクトップほど珍しくありません)。