0

UI に公開される計算メンバーを持ついくつかのクラスがあります。必要なときにのみ読み出しが新しい値を取得するように最適化しようとしています。

たとえば、アイテムを保持できるコンテナがあります。アイテムには、UnitMass、UnitSize、UnitCount などがあります。アイテムは、TotalMass (UnitMass x UnitCount)、TotalSize なども計算します。コンテナーは、コンテンツのそれぞれのメンバーを合計することによって、TotalContentMass、TotalContentSize などを計算します。

コンテナーの所有者は、いつでも 100 個のコンテナーの TotalContentMass などの表示可能な読み取り値を持っている可能性があります。コンテナーが読み取る数値は、1 秒あたり 30 倍変化するか、何時間も同じままである可​​能性があります。

[コンテナ 1] TotalContentMass: 218 | 入手可能質量: 1991
     [項目 1] 単位: 5 | 総質量: 50
     [項目 2] 単位: 3 | 総質量: 96
     ...
[コンテナ 2] TotalContentMass: 944 | 利用可能な質量: 53
     [項目 1] 単位: 12 | 総質量: 16
     [項目 2] 単位: 21 | 総質量: 488
     ...
...

したがって、これらの種類の「TotalX」メンバーについては、計算の ToString 結果を格納するフィールドがあり、その文字列をほとんどの UI 目的に使用すると考えました。文字列を最新の状態に保つために、イベント処理に依存します。

class Item
{
    int _unitCount;
    int _unitMass;
    string _totalMassText;
    int _unitSize;
    string _totalSizeText;

    ...

    public TotalMass { get { return _unitMass * _unitCount; } }
    public TotalMassText { get { return _totalMassText; } }

    public TotalSize { get { return _unitSize * _unitCount; } }
    public TotalSizeText { get { return _totalSizeText; } }

    public UnitCount 
    { 
        get { return _unitCount; } 
        set { 
                _unitCount = value; 
                OnUnitCountChanged();
            } 
    }

    ...

    UpdateTotals()
    {
        _totalMassText = TotalMass.ToString();
        _totalSizeText = TotalSize.ToString();
        ...
    }
}

コンテナなどについても同様です。

これは時期尚早またはマイクロ最適化ですか? コンパイラはそもそもこの種のことを処理しますか? そうでない場合、これはかなり標準的なアプローチですか?

4

1 に答える 1

1

いいえ、コンパイラはここに何も自動的にキャッシュしません。はい、結果の計算にコストがかかる場合は、結果をキャッシュする標準的な方法です。しかし、文字列の作成はそれほど高価ではないので、プロファイラーがそうでないと言うまで、それはマイクロ最適化であると言えます。値が変更されたときにすぐにではなく、オンデマンドでのみ文字列を作成することも有益な場合があります。

于 2012-04-30T11:10:50.823 に答える