Frage

In meinem Code, den ich instanziieren ein Vermächtnis Delphi-Objekt über eine COM-Schnittstelle. Diese Klasse muss oft instanziert werden, so um den Aufwand für die Instanziierung es mich cachen es an einem Punkt, wo 70% aller Anrufe, um das gemeinsame resultierende Objekt hat zu senken.

Allerdings, wenn ich das Objekt ändern, nachdem es zwischengespeichert wird, werden die Änderungen auch im Cache beibehalten. Das macht ich denke, dass die COM-Wrapper-Instanz durch ref übergeben wird, anstatt nach Wert.
Wie kann ich sicherstellen, dass das Objekt im Cache von Wert übergeben wird, dann eher durch ref?

War es hilfreich?

Lösung

Ich denke, dass, wenn es möglich ist, überhaupt zu tun, müssen Sie explizit eine Kopie des Objekts klonen und dann die Kopie zwischenzuspeichern. Siehe zum Beispiel der MemberwiseClone Methode und andere in Antworten erwähnt, um Objekte in C # Klonen.

Andere Tipps

Als erstes wird dies erforderlich?

Ich bin kein Befürworter von „alle Performance-Probleme Messung lösen“, aber in Ihrem Fall sollten Sie.

Der Kopf ein COM-Objekt instanziieren (nach der ersten Strafe Anruf) als solche ist sehr gering - erinnern Sie es entworfen wurde, viele kleine Objekte auf Computer von vor 15 Jahren zu leisten. Ich nehme an, der .NET-Overhead nicht viel mehr ist - so die Frage ist, die Objekte eigene Initialisierung.

Sie können das überprüfen leicht von 1000 Objekten in einer engen Schleife Instanziieren (wirft den ersten Anruf entfernt, kann es sehr teuer sein und würde die durchschnittliche verdirbt)

COM-Objekte sind von Natur aus durch referenz
Es gibt keine für COM-Objekte „von Wert übergeben“, als ihre grundlegende Schnittstelle ein Verweis Zeiger auf die Instanz gezählt ist, und COM aussetzen keine generische „Clone“ -Methode.

mögliche Lösung: Copy-on-Write
Wenn eine nur, wenn Instanziierung ist wirklich teuer, und die Mehrheit der Anrufe durch eine Standardinstanz durchgeführt werden kann, können Sie ein copy-on-write-Schema implementieren.

Sie müssen eine Wrapper-Klasse erstellen, die einen Verweis auf die Standardinstanz hält, und einen Verweis auf eine private Instanz auf 0 initialisiert.

Solange die private Instanz null ist, alle Getter Funktionen sich auf die Standardinstanz otherwis, sie sich auf die private Instanz.

Jeder Setter / Mutator Umleitungen an die privaten Instanz, es zu schaffen, wenn es nicht vorhanden ist.

Dies würde die Schaffung für die private Instanz zum ersten mutierenden Aufruf verzögern. Allerdings müssen Sie die gesamte alle Schnittstellen von Interesse für diese Komponente wickeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top