2009-04-13 10 views
3

タイトルが合っているかどうかは分かりませんが、基本的には、パブリックメンバーを変更する必要があるときや、アクセスしたときにすぐにパブリックメンバーを計算するかどうかについて、 ?最新のものとオンデマンドのもの

CustomCollectionのようなクラスがあり、Countというプロパティがあるとします。 Add,Removeなどの操作ごとにCountを更新するか、またはアクセス時に計算する必要がありますか?

最新の情報は直感的ですが、人々がAddRemoveなどと電話をかけた頻度は.Countです。

プロパティにアクセスしたときにキャッシュできるハイブリッドバージョンもありますか?私は別の変数を更新する必要があると思いますよね?

答えて

4

クラスの状態に関する情報のほとんどは、常にデータを操作する副作用として最新のものでなければなりません。たとえば、Countプロパティは、データの内部ストレージ(つまり、配列の長さ)に基づいています。

クラスの状態の特定の条件に依存するその他のプロパティを計算する必要があるかもしれません。例えば、ContainsValidOrderのプロパティは、クラス内のオーダーによって異なる場合があります。これらのプロパティでは、クラスの使用を評価し、コレクションにアイテムを追加したり削除したりするときに値を計算するコストが安いかどうかを判断し、プロパティにアクセスするたびにコレクション全体をスキャンする必要があります。

しかし、.NETのguidlinesは、プロパティが複雑なコードを実行しないこと、プロパティの繰り返しアクセスに副作用やパフォーマンスの影響がないことを示唆しています。したがって、計算されたデータを表すプロパティの場合、メソッドGetXXXを使用するほうが良いかもしれません。これは、あなたのライブラリを使用している開発者に、1.計算に時間がかかり、2.タスクのduratinoの値を保持する必要があることを示します。

1

この回答は、アプリケーションの種類によって異なります。そして、特定の状況。

カウント変数の場合、計算コストが高くなることがあり、保存コストが非常に低いため、通常はその変数を更新します。

他の状況では、caluculateするためのコストが非常に低いかもしれないが、ストレージのコストが高くなる可能性が(多分場所コードの数の点で正確それを維持するために維持する必要があるであろう)

4

あなたはこれらの機能にアクセスする頻度を考慮する必要があると言えば、そうです。 countに常時アクセスしている場合は、必要以上に遅くなるためオンデマンドではありません。他の機能にさらにアクセスする場合は、毎回countを再計算することも無駄になります。

真ん中には、フラグがfalseに設定されている場合にcountをオンデマンドで計算してから、フラグをtrueに設定するものがあります。 addremoveなどを呼び出すと、フラグはfalseに設定されます。

このような何か:あなたが行にcount複数回アクセスした場合、これは本当に唯一の間でなど、addremoveにアクセスせずに利益をもたらすであろう、そしてそれはaddにアクセスする

Class CachedCount 
    int count = 0; 
    boolean count_is_valid = false; 

    int getCount() 
     if count_is_valid 
      return count; 
     else 
      count = calculate_count(); 
      count_is_valid = true; 
      return count; 

    void Add(item) 
     count_is_valid = false; 
     ... 

    ... 

注意、removeなどは、countへのコールでインターリーブされません。要求がインターリーブされている場合、この利点は失われます。最大の利点は、add, count, add, count, remove, count, remove, count, add, countではなくadd, add, add, remove, remove, add, count, count, count, count, count, countのようなシーケンスから得られます。

+0

ありがとうございました。あなたの中盤に小さな例を挙げてください。 –

+0

私よりも速く:) –

+0

そこには擬似コードがあります。私はそれをC#に変換する練習として残します。それ以外に何か、 – Welbog

1

パブリックメンバーのアクセス頻度と、パブリックメンバーの計算に要した時間に関する何らかの指標を使用することをお勧めします。最新の状態に保つのが簡単な操作であれば、直感的なやり方で操作してください。更新は複雑な操作ですが、アクセスはめったにないので、必要に応じて提供するのが理にかなっています。

2

カウントの更新に要する時間によっては、時間がかかるプロセスでカウントが頻繁にコールされると、コレクションを変更するたびに関数を呼び出すときにカウントを更新することを選択します。

1

オンデマンドは間違いなく簡単ですので、一般的にはより良いと考えることができます。

パフォーマンスに関しては、ほとんどのアプリケーションが違いを気付かないでしょう。どちらのアプローチも彼らの背後にある。最新の戦略は不必要な計算を引き起こす可能性がありますが、オンデマンドでは同じ計算を2回以上実行することがあります(一方で、クライアントは独自の計算値を保存して二重作業を避けることができます) 。オンデマンドでは、理論的にはキャッシュミスが少なく、ガベージコレクトも少なくなるため、パフォーマンスが大幅に低下する可能性があります。しかし、再び、ほとんどのアプリは気づかないだろうと思う。

ちなみに、計算が非常に高価な場合は、.Netコーディングガイドラインが正しく覚えていれば、プロパティに含めてはいけません。

関連する問題