プロジェクトでは Red Gate ソフトウェアのAnts Profiler Proを使用しました。これは、すべての .NET 言語ベースのアプリケーションで非常にうまく機能します。
.NET ガベージ コレクターは、メモリ内オブジェクトのクリーンアップにおいて非常に「安全」であることがわかりました (そうあるべきです)。将来いつか使用する可能性があるという理由だけで、オブジェクトを保持します。これは、メモリ内でインフレートするオブジェクトの数について、より注意を払う必要があることを意味していました。最後に、メモリのオーバーヘッドを減らしてパフォーマンスを向上させるために、すべてのデータ オブジェクトを "inflate on-demand" (フィールドが要求される直前) に変換しました。
編集: 「オンデマンドで膨らませる」という言葉の意味をさらに詳しく説明します。データベースのオブジェクト モデルでは、親オブジェクトのプロパティを使用して子オブジェクトを公開します。たとえば、他の「detail」または「lookup」レコードを 1 対 1 で参照するレコードがある場合、次のように構造化します。
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
上記のシステムでは、メモリ内に多数のレコードがある場合、実際のメモリとパフォーマンスの問題が発生することがわかりました。そこで、オブジェクトが要求されたときにのみインフレートされ、必要なときにのみデータベース呼び出しが行われるシステムに切り替えました。
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
これは、オブジェクトが必要になるまで (Get メソッドがアクセスされるまで) メモリから保持されていたため、はるかに効率的であることが判明しました。これにより、データベース ヒットを制限することでパフォーマンスが大幅に向上し、メモリ スペースが大幅に増加しました。