通过将计算结果缓存到字符串变量进行优化
本文关键字:变量 字符串 优化 缓存 计算 结果 | 更新日期: 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();
...
}
}
容器也是如此,依此类推。
这是过早的还是微观优化?编译器是否首先处理这种事情?如果不是,这是一种相当标准的方法吗?
不,编译器不会在此处自动缓存任何内容。是的,如果结果的计算成本很高,则这是一种缓存结果的标准方法。但是创建字符串并不是很昂贵,所以我会说这是一个微优化,直到分析器另有说明。仅按需创建字符串甚至可能有益,而不是在值更改时立即创建字符串。