9

マイクロ最適化でフレーム戦争を開始したくはありませんが、何かに興味があります。

組み込みデータを持たない型のインスタンスを作成する場合のメモリとパフォーマンスのオーバーヘッドはどれくらいですか?

たとえば、実装する単純なクラスにはIComparer<T>、メソッドのみが含まれ、Compareプロパティやフィールドは含まれない場合があります。

class FooComprarer : IComparer<Foo>
{
    public int Compare (Foo x, Foo y) 
    {
        // blah, blah
    }
}

私が見た典型的なコード例はnew FooComparer()、これらのいずれかが必要な場合はいつでも を呼び出すだけです。

ここでのインスタンス化コストが非常に高いとはまったく想像できませんが、それが実際に何であるかを知りたいと思っています。そして、たとえば、必要な場所で 1 つの比較インスタンスを使用できるように、比較子への型の辞書を保持する静的ファクトリ クラスとどのように比較しますか。

4

3 に答える 3

13

ある程度のオーバーヘッドがありますが、比較ツールを使用する目的と比較すると、おそらく無視できます。

32ビットシステムと64ビットシステムの両方で、そのインスタンスは16バイトのヒープスペースを使用します。オーバーヘッドは2つのポインターであり、32ビットシステムでは8バイト、64ビットシステムでは16バイトを使用します。ただし、32ビットシステムのメモリマネージャは16バイト未満のブロックを割り当てることができないため、ブロックには8バイトの未使用バイトがあります。

それらの比較器を頻繁に再利用する場合は、それらを維持することを検討してください。ただし、寿命の短いオブジェクトは、寿命の長いオブジェクトよりもメモリ管理への負担がはるかに少ないことも考慮する必要があります。そのため、比較対象を存続させる価値があるためには、比較対象を何度も再利用する必要があります。

于 2011-06-27T23:52:31.963 に答える
2

これは質問に正接的に関連しているだけですが、C#3.0以降を使用している場合は、次のパターンを使用できます。

public class AdhocComparer<T> : IComparer
{
    Func<T, T, int> comparer;

    AdhocComparer(Func<T, T, int> comparer)
    {

        this.comparer = comparer;

    }

    public int Compare (Foo x, Foo y) 
    {
        return comparer(x, y);
    }

}

そして、そのように使用します:

var fooComparer = new AdhocComparer<Foo>( (x, y) => /* do stuff */);

このようにして、必要なIComparerの種類ごとにクラスを作成する必要はありません。

于 2011-06-28T02:04:56.537 に答える
2

少なくとも、クラス オブジェクトには、データ メンバーがなくても、型情報へのポインターといくつかのハウスキーピング情報があります。

http://www.simple-talk.com/dotnet/.net-framework/object-overhead-the-hidden-.net-memory--allocation-cost/によると:

32 ビット システムでは、すべてのオブジェクトに 8 バイトのヘッダーがあります [...] 64 ビット システムでは、状況はさらに悪化します。オブジェクト ヘッダーは 16 バイトに増加します。

于 2011-06-27T23:40:12.040 に答える