Hemos utilizado el software Ants Profiler Pro de Red Gate en nuestro proyecto. Funciona realmente bien para todas las aplicaciones basadas en lenguaje .NET.
Descubrimos que .NET Garbage Collector es muy "seguro" en la limpieza de objetos en memoria (como debería ser). Mantendría objetos alrededor solo porque podríamos estar usándolo en algún momento en el futuro. Esto significaba que teníamos que tener más cuidado con la cantidad de objetos que inflamos en la memoria. Al final, convertimos todos nuestros objetos de datos en un "inflado a pedido" (justo antes de que se solicite un campo) para reducir la sobrecarga de memoria y aumentar el rendimiento.
EDITAR: Aquí hay una explicación adicional de lo que quiero decir con "inflar bajo demanda". En nuestro modelo de objetos de nuestra base de datos, utilizamos las propiedades de un objeto primario para exponer los objetos secundarios. Por ejemplo, si tuviéramos algún registro que hiciera referencia a algún otro registro de "detalle" o "búsqueda" de forma individual, lo estructuraríamos así:
class ParentObject
Private mRelatedObject as New CRelatedObject
public Readonly property RelatedObject() as CRelatedObject
get
mRelatedObject.getWithID(RelatedObjectID)
return mRelatedObject
end get
end property
End class
Descubrimos que el sistema anterior creó algunos problemas reales de memoria y rendimiento cuando había muchos registros en la memoria. Entonces cambiamos a un sistema donde los objetos se inflaban solo cuando se solicitaban, y las llamadas a la base de datos se realizaban solo cuando era necesario:
class ParentObject
Private mRelatedObject as CRelatedObject
Public ReadOnly Property RelatedObject() as CRelatedObject
Get
If mRelatedObject is Nothing
mRelatedObject = New CRelatedObject
End If
If mRelatedObject.isEmptyObject
mRelatedObject.getWithID(RelatedObjectID)
End If
return mRelatedObject
end get
end Property
end class
Esto resultó ser mucho más eficiente porque los objetos se mantuvieron fuera de la memoria hasta que se necesitaron (se accedió al método Get). Proporcionó un aumento de rendimiento muy grande al limitar los accesos a la base de datos y una gran ganancia en espacio de memoria.