2011-02-10 9 views
1

譲受人と等しくない場合にのみ値を割り当てることをお勧めしますか?例えば、希望:割り当てる前に等しいかどうかチェックしますか?

bool isVisible = false;  
if(TextBox1.Visible != isVisible) 
    TextBox1.Visible = isVisible; 

がより望ましいことがより:

bool isVisible = false;  
TextBox1.Visible = isVisible; 

また、答えが高価割り当てとオブジェクト対高価Equalsメソッドを有するオブジェクトと同様、データの種類に依存しません方法?

+0

パフォーマンスは完全に無意味なので、読みやすいものを選択してください。 (何かがあれば、より読み易い2番目のオプションも高速です)。 –

答えて

1

あなたの本能は正しいと思われます。操作のコストによって異なります。

例では、テキストボックスを表示または非表示にすると、テストのコストは気付かず(ウィンドウ構造内のビットをチェックするだけです)、割り当てのコストも通常は気付かれません(ウィンドウを再描画)。実際、「可視」ビットを既存の値に設定すると、関数呼び出しコストは発生しますが、ウィンドウマネージャはビットをチェックして直ちに戻ります。この場合は、それを割り当ててください。

しかし、それ以外の場合は重要です。たとえば、長い文字列またはバイナリオブジェクトのキャッシュされたコピーがあり、新しい値を割り当てるたびにデータベースに保存されます。次に、データベースへの不要な書き込みを節約するために、毎回同じ価値があるとテストする価値があることがわかります。間違いなく、より高価なシナリオを想像することができます。

したがって、一般的に、テストのコスト、割り当てのコスト、同じ値を割り当てることと比較して新しい値を割り当てる相対的な頻度の少なくとも1つを考慮する必要があります。

3

読みやすさの観点からは、私は間違いなく第2の方法を好むでしょう。

2

一部のオブジェクトプロパティには、すでに保持している値を割り当てると特定の効果があることを要求するセマンティクスがあります。たとえば、オブジェクトの「テキスト」を設定すると、値が変更されなくても強制的に再描画が行われることがあります。このようなオブジェクトを扱うときは、アクションを実行させたくない場合を除いて、不平等であるかどうかをテストして設定する必要があります。

通常、フィールドを使用すると、セットの前に比較を行う利点はありません。しかし、1つの顕著な例外があります:並行して実行されている多くのスレッドがフィールドを同じ値に設定したい場合、すでにその値を保持している可能性が高いため、すべてのスレッドが無条件にフィールドに書き込む必要があるプロセッサは、それを書き込んだ最新のプロセッサからキャッシュラインを取得する必要があるからです。対照的に、すべてのプロセッサが単にフィールドを読み取り、それをそのままにしておくと、キャッシュラインをすべて共有することができ、パフォーマンスが大幅に向上します。