Domanda

Nel mio codice che sto un'istanza di un oggetto Delphi legacy attraverso un'interfaccia COM. Questa classe deve essere istanziata più volte, in modo da per ridurre l'overhead di istanziandola I nella cache in un punto in cui il 70% di tutte le chiamate hanno l'oggetto risultante comune.

Tuttavia, quando ho alterare l'oggetto dopo che è memorizzato nella cache, le modifiche vengono mantenute nella cache troppo. Questo mi fa pensare l'istanza COM involucro è passato da ref invece che per valore.
Come posso fare in modo che l'oggetto in cache è passato per valore piuttosto che da ref?

È stato utile?

Soluzione

Credo che, se è possibile fare a tutti, è necessario clonare in modo esplicito una copia dell'oggetto e poi in cache la copia. Si veda ad esempio il metodo MemberwiseClone, e altri di cui risposte alle Clonazione oggetti in C # .

Altri suggerimenti

In primo luogo, è necessario?

Non sono un sostenitore della "misura a risolvere tutti i problemi di performance", ma nel tuo caso, si dovrebbe.

L'overhead di istanziare un oggetto COM (dopo il primo rigore chiamata) in quanto tale è molto bassa - ricordo che è stato progettato per permettere tanti piccoli oggetti sui computer di 15 anni fa. Suppongo che il sovraccarico .NET non è molto di più - Quindi la domanda è la stessa di inizializzazione degli oggetti.

È possibile verificare che facilmente istanziando 1000 oggetti in un loop stretto (buttare via la prima chiamata, può essere molto costoso e avrebbe rovinato la media)

COM oggetti sono intrinsecamente con riferimento
Non c'è "passaggio per valore" per gli oggetti COM, come interfaccia di base è un riferimento contato puntatore all'istanza e COM non espone un metodo generico "Clone".

possibile soluzione: Copy-on-Write
Se un solo se esemplificazione è davvero costoso, e la maggior parte delle chiamate può essere fatto attraverso un'istanza predefinita, è possibile implementare un sistema di copy-on-write.

È necessario creare una classe wrapper che contiene un riferimento all'istanza di default, e un riferimento a un'istanza privata inizializzato a 0.

Fino a quando l'istanza privata è null, tutte le funzioni getter avanti per l'istanza predefinita, otherwis, che in avanti per l'istanza privato.

Ogni setter chiamata / mutatore in avanti per l'istanza del privato, creando quando non esiste.

Questo potrebbe ritardare la creazione per l'istanza privato alla prima chiamata mutazione. Tuttavia, si deve avvolgere l'intero tutte le interfacce di interesse per questo componente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top