gpt4 book ai didi

delphi - 缓存计算值的方法

转载 作者:行者123 更新时间:2023-12-03 14:48:16 24 4
gpt4 key购买 nike

在我们正在开发的 Delphi 应用程序中,我们有一个由相关对象组成的大型结构。这些对象的一些属性具有在运行时计算的值,我正在寻找一种方法来缓存结果以进行更密集的计算。我使用的一种方法是在第一次计算时将值保存在私有(private)成员中。这是一个简短的示例:

unit Unit1;

interface

type
TMyObject = class
private
FObject1, FObject2: TMyOtherObject;
FMyCalculatedValue: Integer;
function GetMyCalculatedValue: Integer;
public
property MyCalculatedValue: Integer read GetMyCalculatedValue;
end;

implementation

function TMyObject.GetMyCalculatedValue: Integer;
begin
if FMyCalculatedValue = 0 then
begin
FMyCalculatedValue :=
FObject1.OtherCalculatedValue + // This is also calculated
FObject2.OtherValue;
end;

Result := FMyCalculatedValue;
end;

end.

用于计算的对象发生变化并且缓存的值应该被重置并重新计算的情况并不罕见。到目前为止,我们通过使用观察者模式解决了这个问题:对象实现 OnChange 事件,以便其他人可以订阅,在更改时收到通知并重置缓存值。这种方法有效,但有一些缺点:

  • 管理订阅需要大量内存。
  • 当缓存值依赖于大量对象(例如列表)时,它无法很好地扩展。
  • 依赖关系不是很具体(即使缓存值仅依赖于一个属性,当其他属性发生更改时,它也会被重置)。
  • 管理订阅会影响整体性能并且难以维护(对象被删除、移动等)。
  • 尚不清楚如何处理取决于其他计算值的计算。

最后一个问题:您能否建议其他实现缓存计算值的方法?

最佳答案

如果您想避免观察者模式,您可以尝试使用散列方法。

想法是对参数进行“散列”,并检查其是否与保存状态的“散列”匹配。如果不存在,则重新计算(从而将新的哈希值保存为键)。

我知道我说得好像只是我想到的,但事实上它被一些知名软件所使用。

例如,SCons (Makefile 替代方案)检查目标是否需要重新构建,最好采用时间戳方法。

我们已经使用 SCons 一年多了,我们从未检测到任何未重建的目标问题,因此它们的哈希效果很好!

关于delphi - 缓存计算值的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1536357/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com