0

我有几个类将计算成员暴露给 UI。我正在尝试优化,以便读数仅在需要时获得新值。

例如,我有一个可以容纳物品的容器。项目有 UnitMass、UnitSize、UnitCount 等。项目还计算它们的 TotalMass (UnitMass x UnitCount)、TotalSize 等。容器通过对其内容的各个成员求和来计算它们的 TotalContentMass、TotalContentSize 等。

容器所有者可能随时都可以看到一百个容器的 TotalContentMass 等读数。任何容器读取的任何数字都可能每秒变化 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();
        ...
    }
}

Container 也是如此,以此类推。

这是过早的优化还是微优化?编译器首先会处理这种事情吗?如果不是,这是一种相当标准的方法吗?

4

1 回答 1

1

不,编译器不会在此处自动缓存任何内容。是的,如果计算结果的成本很高,这是缓存结果的标准方法。但是创建字符串并不是很昂贵,所以我会说这是一个微优化,直到分析器另有说明。仅在需要时而不是在值更改时立即创建字符串甚至可能是有益的。

于 2012-04-30T11:10:50.823 回答