4

非常に高速なこのアプローチを使用して、ディレクトリ内のすべてのファイルを再帰的に見つけます。

とにかく、構造体の各ファイルに情報を保存します。

struct Info 
{
    public bool IsDirectory;
    public string Path;
    public FILETIME ModifiedDate;
}

だから今、私は天気を決定して、ヘルパーメソッドをその構造体の内部または別の場所に配置して、効率を上げようとしています。

ヘルパー メソッドは次のとおりです。

struct Info 
{
    public bool IsDirectory;
    public string Path;
    public FILETIME ModifiedDate;

    // Helper methods:
    public string GetFileName(){ /* implementation */ }
    public string GetFileSize(){ /* implementation */ }
    public string GetFileAtributes() { /* implementation */ }
    // etc many more helper methods
}

私は何千ものファイルをメモリに保存していますが、Info 内にこれらのメソッドがあるとパフォーマンスに影響するかどうかわかりません。つまり、これらのメソッドを削除して、次のように拡張メソッドにする方がよいでしょう。

public static class ExtensionHelperMethods
{
    static public string GetFileName(this Info info){ /* implementation */ }
    static public string GetFileSize(this Info info){ /* implementation */ }
    static public string GetFileAtributes(this Info info) { /* implementation */ }
    // etc many more helper methods
}

だから私の質問はInfoインスタンス構造体であり、それらのメソッドを内部に持つと、より多くのメモリが必要になるからですか? インスタンス構造体の場合Info、各メソッドはメモリ内に異なるアドレスを持ちますか?

私は両方のテクニックを試しましたが、違いがわかりません。もっと多くのファイルを試してみる必要があるかもしれません。


編集

@Fabio Gouwがライトであることを証明するには、次のようにします。

// This program compares the size of object a and b
class Program
{
    static void Main(string[] args)
    {
        InfoA a = new InfoA();
        InfoB b = new InfoB();

        if (ToBytes(a).Length == ToBytes(b).Length)
        {
            Console.Write("Objects are the same size!!!");
        }

        Console.Read();
    }

    public static byte[] ToBytes(object objectToSerialize)
    {
        BinaryFormatter bf = new BinaryFormatter();
        MemoryStream memStr = new MemoryStream();

        try
        {
            bf.Serialize(memStr, objectToSerialize);
            memStr.Position = 0;

            var ret = memStr.ToArray();

            return ret;
        }
        finally
        {
            memStr.Close();
        }
    }

    [Serializable]
    struct InfoA
    {
        public bool IsDirectory;
        public string Path;
    }

    [Serializable]
    struct InfoB
    {
        public bool IsDirectory;
        public string Path;

        public string GetFileName()
        {
            return System.IO.Path.GetFileName(Path);
        }
    }
}
4

2 に答える 2

5

メソッドはオブジェクトのサイズに干渉しません。フィールドのみが干渉します (メソッドは動作です。フィールドはデータであり、これらはメモリに格納されます)。それらを Info クラス内に配置するか、拡張メソッドとして配置するかの決定は、設計上の問題にすぎません。

この質問はあなたのものと似ています:メソッドを静的メソッドに変換するときのメモリ使用量

于 2012-09-05T17:49:46.100 に答える
0

私は構造を動作ではなくオブジェクトの形状に制限する傾向があります。クラスは、動作を目的としています。より大きな潜在的な問題は、型をメソッド パラメーターとして渡すときに、特にボクシング操作とスタック/ヒープの割り当てを監視する方法です。

そうは言っても、クラスの拡張メソッドは、ネイティブの静的メソッドを呼び出すよりもほとんどが構文糖衣です。コンパイラは拡張メソッドを Extension メソッドの呼び出しに変換するため、静的メソッドと拡張メソッドの間に実行時のパフォーマンスの違いはありません。

後で同様のメソッドを基礎となるクラス/構造体に追加し、拡張メソッドが使用されると予想したときにネイティブメソッドが使用されていることがわかった場合、拡張メソッドは自分自身を撃つ可能性を開きます。また、拡張メソッドは、通常の静的メソッドで使用できる完全修飾名または名前空間エイリアスと比較して、あいまいさを解消するのが困難です。拡張メソッドのコンパイル方法の詳細については、http: //www.thinqlinq.com/Post.aspx/Title/DLinq-Extension-Methods-Decomposed を参照してください。

于 2012-09-05T17:52:32.117 に答える