W naszym projekcie wykorzystaliśmy oprogramowanie Ants Profiler Pro firmy Red Gate. Działa bardzo dobrze we wszystkich aplikacjach opartych na języku .NET.
Odkryliśmy, że .NET Garbage Collector jest bardzo „bezpieczny” w czyszczeniu obiektów w pamięci (tak jak powinno). Utrzymywałoby obiekty w pobliżu tylko dlatego, że moglibyśmy go kiedyś używać w przyszłości. Oznaczało to, że musieliśmy bardziej uważać na liczbę obiektów, które napompowaliśmy w pamięci. Ostatecznie przekonwertowaliśmy wszystkie nasze obiekty danych na „inflację na żądanie” (tuż przed żądaniem pola), aby zmniejszyć obciążenie pamięci i zwiększyć wydajność.
EDYCJA: Oto dalsze wyjaśnienie, co mam na myśli, mówiąc o „nadmuchaniu na żądanie”. W naszym modelu obiektowym naszej bazy danych używamy właściwości obiektu nadrzędnego, aby wyeksponować obiekt (y) potomne. Na przykład, gdybyśmy mieli jakiś rekord, który odnosił się do jakiegoś innego „szczegółu” lub „wyszukiwania” na zasadzie jeden do jednego, utworzylibyśmy taką strukturę:
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
Odkryliśmy, że powyższy system powodował pewne problemy z pamięcią i wydajnością, gdy w pamięci było dużo rekordów. Dlatego przeszliśmy na system, w którym obiekty były nadmuchiwane tylko wtedy, gdy były wymagane, a wywołania bazy danych były wykonywane tylko wtedy, gdy było to konieczne:
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
Okazało się to znacznie bardziej wydajne, ponieważ obiekty były przechowywane poza pamięcią, dopóki nie były potrzebne (uzyskano dostęp do metody Get). Zapewnił bardzo duży wzrost wydajności w ograniczaniu trafień w bazie danych i ogromny przyrost miejsca w pamięci.