Ansätze zum Zwischenspeichern berechneter Werte

8

In einer Delphi-Anwendung, an der wir arbeiten, haben wir eine große Struktur verwandter Objekte. Einige der Eigenschaften dieser Objekte haben Werte, die zur Laufzeit berechnet werden, und ich suche nach einer Möglichkeit, die Ergebnisse für die intensiveren Berechnungen zwischenzuspeichern. Ein Ansatz, den ich verwende, ist das Speichern des Wertes in einem privaten Mitglied bei der ersten Berechnung. Hier ist ein kurzes Beispiel:

%Vor%

Es ist nicht ungewöhnlich, dass sich die für die Berechnung verwendeten Objekte ändern und der zwischengespeicherte Wert zurückgesetzt und neu berechnet werden sollte. Bisher haben wir dieses Problem mithilfe des Observer-Musters behoben: Objekte implementieren ein OnChange-Ereignis, sodass andere Abonnenten teilnehmen können. Sie erhalten Benachrichtigungen, wenn sie zwischengespeicherte Werte ändern und zurücksetzen. Dieser Ansatz funktioniert, hat aber einige Nachteile:

  • Die Verwaltung von Abonnements erfordert viel Speicherplatz.
  • Es ist nicht gut skalierbar, wenn ein zwischengespeicherter Wert von vielen Objekten abhängt (z. B. einer Liste).
  • Die Abhängigkeit ist nicht sehr spezifisch (selbst wenn ein Cache-Wert nur von einer Eigenschaft abhängt, wird er auch zurückgesetzt, wenn sich andere Eigenschaften ändern).
  • Die Verwaltung von Abonnements wirkt sich auf die Gesamtleistung aus und ist schwer zu warten (Objekte werden gelöscht, verschoben, ...).
  • Es ist nicht klar, wie mit Berechnungen in Abhängigkeit von anderen berechneten Werten umgegangen werden soll.

Und schließlich die Frage: Können Sie andere Ansätze zur Implementierung von zwischengespeicherten berechneten Werten vorschlagen?

    
Tihauan 08.10.2009, 08:14
quelle

3 Antworten

1

In meiner Arbeit verwende ich Fett für Delphi , das unbegrenzte komplexe Strukturen von zwischengespeicherten Werten in Abhängigkeit voneinander verwalten kann. Normalerweise enthält jede Variable nur einen kleinen Teil des Problems. In diesem Framework heißt das abgeleitete Attribute. Abgeleitet, da der Wert nicht in der Datenbank gespeichert wird. Er hängt nur von anderen abgeleiteten Attributen oder persistenten Attributen in der Datenbank ab.

Der Code hinter diesem Attribut wird in Delphi als Prozedur oder in OCL (Object Constraint Language) im Modell geschrieben. Wenn Sie es als Delphi-Code schreiben, müssen Sie die abhängigen Variablen abonnieren. Wenn also das Attribut C von A und B abhängt, wird C immer dann aufgerufen, wenn A oder B den Code für Neukalibrieren. C wird automatisch aufgerufen, wenn C gelesen wird. Also wird beim ersten Lesen von C A und B auch gelesen (vielleicht aus der Datenbank). Solange A und B nicht geändert werden, können Sie C lesen und eine sehr schnelle Leistung erzielen. Für komplexe Berechnungen kann dies eine Menge CPU-Zeit einsparen.

Der Nachteil und die schlechte Nachricht ist, dass Bold nicht mehr offiziell unterstützt wird und Sie es auch nicht kaufen können. Ich nehme an, Sie können bekommen, wenn Sie genug Leute fragen, aber ich weiß nicht, wo Sie es herunterladen können. Um 2005-2006 war es kostenlos von Borland downloadbar, aber nicht mehr. Es ist nicht für D2009 bereit, da jemand es in Unicode portieren muss.

Eine weitere Option ist ECO mit dot.net von Fähige Objekte . ECO ist ein Plugin in Visual Studio. Es ist ein unterstütztes Framework, das dieselbe Idee und denselben Autor wie Fett für Delphi hat. Viele Dinge werden auch verbessert, zum Beispiel wird Databinding für die GUI-Komponenten verwendet. Sowohl Bold als auch ECO verwenden ein Modell als einen zentralen Punkt mit Klassen, Attributen und Links. Diese können in einer Datenbank oder einer XML-Datei gespeichert werden. Mit der kostenlosen Version von ECO kann das Modell maximal 12 Klassen haben, aber wie ich mich erinnere, gibt es keine anderen Grenzen.

Bold und ECO enthalten viel mehr als abgeleitete Attribute, die Sie produktiver machen und Ihnen erlauben, über das Problem nachzudenken, anstatt über technische Details der Datenbank oder in Ihrem Fall über das Speichern von Werten. Sie sind willkommen mit mehr Fragen zu diesen Frameworks!

Bearbeiten: Es gibt tatsächlich einen Download Link für Embarcadero registrierte Benutzer für Fett für Delphi für D7, ziemlich alt ... Ich weiß, dass es Updates für D2005, ad D2006 gab.

    
Roland Bengtsson 08.10.2009, 18:11
quelle
4

Wenn Sie das Beobachtermuster vermeiden möchten, könnten Sie versuchen, einen Hashing-Ansatz zu verwenden.

Die Idee wäre, dass Sie die Argumente "hacken" und prüfen, ob diese mit dem Hash übereinstimmen, für den der Status gespeichert ist. Wenn dies nicht der Fall ist, berechnen Sie den neuen Hash als Schlüssel und speichern ihn ().

Ich weiß, dass ich es so klingen lasse, als hätte ich gerade darüber nachgedacht, aber tatsächlich wird es von bekannten Softwares verwendet.

Zum Beispiel prüft SCons (Makefile-Alternative), ob das Ziel neu erstellt werden muss, vorzugsweise zu einem Timestamp-Ansatz .

Wir haben SCON schon seit über einem Jahr benutzt, und wir haben nie ein Problem mit einem Ziel festgestellt, das nicht neu aufgebaut wurde, also funktioniert ihr Hash gut!

    
Matthieu M. 08.10.2009 08:46
quelle
2

Sie können lokale Kopien der externen Objektwerte speichern, die benötigt werden. Die Zugriffsroutine vergleicht dann die lokale Kopie mit dem externen Wert und führt die Neuberechnung nur bei einer Änderung durch.

Der Zugriff auf die Eigenschaften der externen Objekte würde ebenfalls eine mögliche Neubewertung dieser Eigenschaften erzwingen, sodass das System automatisch auf dem neuesten Stand bleibt, aber nur dann neu berechnet, wenn es erforderlich ist. Ich weiß nicht, ob Sie Maßnahmen ergreifen müssen, um zirkuläre Abhängigkeiten zu vermeiden.

Dies erhöht den Platzbedarf für jedes Objekt, entfernt jedoch das Beobachtermuster. Es verschiebt auch alle Berechnungen, bis sie benötigt werden, anstatt die Berechnung jedes Mal durchzuführen, wenn sich ein Quellenparameter ändert. Ich hoffe, dass dies für Ihr System relevant ist.

%Vor%     
IanH 08.10.2009 10:57
quelle

Tags und Links