0

CSLA フレームワークの基本的な方法論に従うアプリケーションがあります。具体的には、オブジェクトはその状態を維持する方法と、自分自身を作成、更新、削除する方法を知っています。car クラスはこの考え方を示しています。

public class Car
{
    public int Color {get;set;}
    public void Drive(){.. Do something Here}
    private Car(){} // Only factory method can create this object
    public static Car New()
    {
        Car car = new Car();
        car.DataFetch();
        return car;
    }
    private void DataFetch()
    { 
        // Fill up this object with values from DB or where ever
        this.Color = repo.valueForColor();
        // ...
    }
}   

アプリケーションは 100 万を超えるオブジェクトを作成および破棄します。ガベージ コレクションの量が原因で、オブジェクト作成のせん断数がパフォーマンスに影響を与えています。また、これらのオブジェクトの多くは完全に一時的なものであり、単にデータをリポジトリに渡すために使用されます。

Flyweight パターンについて読んだことがありますが、これは私のニーズに合っているようです。また、オブジェクト プーリングと関連するコードについても読みました。

私が問題を抱えているのは、プールを使用して何百万もの Car オブジェクトを作成するか、オブジェクトの原則と組み合わせてフライウェイトのデータを外部化することで、独自のデータとデータアクセスを維持する必要があります

これを達成する方法についてのアイデアはありますか?

4

1 に答える 1

1

オブジェクトの生成が実際に影響を与えることを確認してください。オブジェクトの生成とGCはSQLServerではCHEAPであり、データベースが関係しています。IOは、ap rofilderが、パフォーマンスに影響を与えているのはオブジェクトの作成と破壊ではなく、そもそも100万個のオブジェクトをプルしていることを示していると確信しています。

実際、オブジェクトを引っ張るのは、オブジェクトを作成して破壊するよりも1000倍遅くなるはずです。

特に、次のようなばかげた非効率的なコード

this.Color = dataReader.get( "Color");

これは、すべての車のハッシュテーブルlokoupです。フィールドのインデックスを保存し(またはそれを知っていれば、SQLの実行間で変更されません)、インデックスを使用するのはどうですか?それだけで、他のどのアプローチよりも多くのことがもたらされます。特に、yuoが100万個の個別のSQLステートメントを発行する場合-あなたがそうしているように。

パフォーマンスの最適化を行うときはいつものように:プロファイラーを実行します。あなたの場合、あなたはあなたがあなたの時間を無駄にしているという間違った考えに100%います。オブジェクトの作成とgcは、パフォーマンスの浪費のトップ10にも表示されないことがわかります。

于 2010-12-06T16:45:16.833 に答える