我们在项目中使用了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方法)。它在限制数据库命中方面提供了极大的性能提升,并在内存空间上获得了巨大的收益。