我不想对微优化发动一场火焰大战,但我对某些事情感到好奇。

在创建没有内部数据的类型的实例的内存和性能方面,开销是多少?

例如,实现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个未使用的字节。

如果您经常重复使用这些比较器,则可以考虑保留它们。但是,您还应该考虑到,生命周期短的对象比生命周期长的对象对内存管理的影响要小得多,因此您必须大量重用比较器,以使其值得存活。

09-30 15:48
查看更多