您所谈论的是生命周期依赖关系链,一件事依赖于另一件事,可以在其控制范围之外进行修改。
如果你有一个幂函数,从a
,b
到c
那里,如果a
和b
相同,则c
是相同的,但检查的成本b
是高的,那么你可以:
- 接受您有时会使用过时的信息进行操作,并且不要总是检查
b
- 尽最大可能使检查
b
尽快
你不能吃蛋糕也不能吃...
如果您可以a
在顶部放置一个额外的缓存,那么这将对最初的问题产生一点影响。如果选择1,那么您将拥有自己的一切自由,因此可以缓存更多,但必须记住要考虑的缓存值的有效性b
。如果选择2,则您仍必须b
每次都检查一次,但可以退回缓存以检查a
是否b
签出。
如果您分层缓存,则必须考虑是否由于综合行为而违反了系统的“规则”。
如果您知道a
始终有效b
,那么您可以这样安排您的缓存(伪代码):
private map<b,map<a,c>> cache //
private func realFunction // (a,b) -> c
get(a, b)
{
c result;
map<a,c> endCache;
if (cache[b] expired or not present)
{
remove all b -> * entries in cache;
endCache = new map<a,c>();
add to cache b -> endCache;
}
else
{
endCache = cache[b];
}
if (endCache[a] not present) // important line
{
result = realFunction(a,b);
endCache[a] = result;
}
else
{
result = endCache[a];
}
return result;
}
x
只要在每个阶段新添加的输入的有效性与:和:的a
:b
关系匹配,显然连续的分层(say )都是微不足道的。x
b
x
a
但是,您很有可能获得三个输入,其有效性完全独立(或循环),因此不可能分层。这意味着标记为//重要的行必须更改为
如果(endCache [a] 过期或不存在)