通过将计算结果缓存到字符串变量进行优化

本文关键字:变量 字符串 优化 缓存 计算 结果 | 更新日期: 2023-09-27 18:32:46

我有几个类,这些类将向UI公开计算成员。我正在尝试进行优化,以便读数仅在需要时获得新值。

例如,我有一个可以容纳物品的容器。项目有单位质量、单位大小、单位计数等。项目还计算其总质量(单位质量 x 单位计数(、总大小等。容器通过对其内容的相应成员求和来计算其 TotalContentMass、TotalContentSize 等。

容器

所有者可能随时可以看到一百个容器的TotalContentMass等读数。任何容器读取的任何数字都可能每秒更改 30 倍,或者可能连续数小时保持不变。

[容器 1]总内容质量: 218 |可用质量: 1991     [商品 1]单位: 5 |总质量: 50     [商品 2]单位: 3 |总质量: 96     ...[容器 2]总内容质量: 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();
        ...
    }
}

容器也是如此,依此类推。

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

通过将计算结果缓存到字符串变量进行优化

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