我不想对微优化发动一场火焰大战,但我对某些事情感到好奇。
在创建没有内部数据的类型的实例的内存和性能方面,开销是多少?
例如,实现IComparer<T>
的简单类可能只包含Compare
方法,而没有属性或字段。
class FooComprarer : IComparer<Foo>
{
public int Compare (Foo x, Foo y)
{
// blah, blah
}
}
我见过的典型示例代码仅在需要其中之一的地方调用
new FooComparer()
。我无法想象这里的实例化成本非常高,但是我很想知道它的实际成本。它将与静态工厂类进行比较,该静态工厂类维护比较器的类型字典,以便可以在需要的任何地方使用一个比较器实例。
最佳答案
有一些开销,但是与您将要使用比较器的开销相比,可以忽略不计。
在32位和64位系统上,该实例都将使用16个字节的堆空间。开销是两个指针,在32位系统上使用8个字节,在64位系统上使用16个字节。但是,32位系统中的内存管理器无法分配小于16字节的块,因此该块中将有8个未使用的字节。
如果您经常重复使用这些比较器,则可以考虑保留它们。但是,您还应该考虑到,生命周期短的对象比生命周期长的对象对内存管理的影响要小得多,因此您必须大量重用比较器,以使其值得存活。