Wir haben in unserem Projekt die Software Ants Profiler Pro von Red Gate verwendet. Es funktioniert sehr gut für alle sprachbasierten .NET-Anwendungen.
Wir haben festgestellt, dass der .NET Garbage Collector bei der Bereinigung von In-Memory-Objekten (wie es sein sollte) sehr "sicher" ist. Es würde Objekte in der Nähe halten, nur weil wir es möglicherweise irgendwann in der Zukunft verwenden werden. Dies bedeutete, dass wir bei der Anzahl der Objekte, die wir im Speicher aufgeblasen hatten, vorsichtiger sein mussten. Am Ende haben wir alle unsere Datenobjekte in ein "Inflate-on-Demand" konvertiert (kurz bevor ein Feld angefordert wird), um den Speicheraufwand zu reduzieren und die Leistung zu steigern.
EDIT: Hier ist eine weitere Erklärung dessen, was ich unter "Inflate on Demand" verstehe. In unserem Objektmodell unserer Datenbank verwenden wir Eigenschaften eines übergeordneten Objekts, um die untergeordneten Objekte verfügbar zu machen. Wenn wir beispielsweise einen Datensatz hätten, der eins zu eins auf einen anderen "Detail" - oder "Lookup" -Datensatz verweist, würden wir ihn folgendermaßen strukturieren:
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
Wir haben festgestellt, dass das oben genannte System einige echte Speicher- und Leistungsprobleme verursacht hat, wenn sich viele Datensätze im Speicher befinden. Deshalb haben wir auf ein System umgestellt, bei dem Objekte nur dann aufgeblasen wurden, wenn sie angefordert wurden, und Datenbankaufrufe nur bei Bedarf durchgeführt wurden:
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
Dies stellte sich als viel effizienter heraus, da Objekte nicht gespeichert wurden, bis sie benötigt wurden (auf die Get-Methode wurde zugegriffen). Es bot eine sehr große Leistungssteigerung bei der Begrenzung von Datenbanktreffern und einen enormen Gewinn an Speicherplatz.