我们在项目中使用了 Red Gate 软件的Ants Profiler Pro。它适用于所有基于 .NET 语言的应用程序。
我们发现 .NET 垃圾收集器在清理内存对象时非常“安全”(应该如此)。它将保留对象只是因为我们将来可能会使用它。这意味着我们需要更加小心我们在内存中膨胀的对象数量。最后,我们将所有数据对象转换为“按需膨胀”(就在请求字段之前),以减少内存开销并提高性能。
编辑:这是我所说的“按需膨胀”的进一步解释。在我们数据库的对象模型中,我们使用父对象的属性来公开子对象。例如,如果我们有一些记录在一对一的基础上引用了一些其他“详细信息”或“查找”记录,我们将这样构建它:
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 方法)。它在限制数据库命中和内存空间方面提供了非常大的性能提升。