Pregunta

En mi código que estoy instancias de un objeto Delphi legado a través de una interfaz COM. Esta clase tiene que ser instanciado muchas veces, por lo que con el fin de reducir la sobrecarga de instanciándola que almacenar en caché en un punto donde el 70% de todas las llamadas tienen el objeto resultante común.

Sin embargo, cuando alterar el objeto después de que se almacena en caché, los cambios se conservan en la memoria caché también. Esto me hace pensar en la instancia COM envoltorio se pasa por ref lugar de por valor.
¿Cómo puedo estar seguro de que el objeto en caché se pasa por valor en lugar de por ref?

¿Fue útil?

Solución

Creo que, si es posible hacerlo en absoluto, es necesario clonar explícitamente una copia del objeto y luego almacenar en caché la copia. Ver el método MemberwiseClone por ejemplo, y otros mencionados en respuestas a Clonación de objetos en C # .

Otros consejos

En primer lugar, se necesita esta?

No soy un defensor de la "medición de resolver todos los problemas de rendimiento", pero en su caso, debería hacerlo.

La sobrecarga de crear instancias de un objeto COM (después de la primera pena de llamada), como tal, es muy baja - recuerda que fue diseñado para permitir muchos objetos pequeños en los ordenadores de hace 15 años. Asumo la sobrecarga .NET no es mucho más - por lo que la cuestión es el objeto propio de inicialización.

Puede comprobar que fácilmente creando una instancia de 1000 objetos en un bucle estrecho (tirar la primera llamada, que puede ser muy caro y echaría a perder la media)

COM objetos son inherentemente por referencia
No hay un "paso por valor" para objetos COM, ya que su interfaz básica es una referencia contado puntero a la instancia, y COM no expone un método genérico "clon".

posible solución: Copy-on-Write
Si una ejemplificación solamente si es realmente caro, y la mayoría de las llamadas se puede hacer a través de una instancia predeterminada, se puede implementar un esquema de copia en escritura.

Es necesario crear una clase contenedora que contiene una referencia a la instancia predeterminada, y una referencia a una instancia privada inicializado a 0.

Mientras la instancia privada es null, todas las funciones getter hacia adelante a la instancia predeterminada, otherwis, se adelante a la instancia privada.

Cada / call mutador colocador hacia delante a la instancia privada, la creación de él cuando no existe.

Esto retrasaría la creación de la instancia privada a la primera llamada mutante. Sin embargo, hay que envolver la totalidad de todas las interfaces de interés para este componente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top