0

我有一个遵循 CSLA 框架中基本方法的应用程序。具体来说,对象知道如何维护它们的状态以及如何创建、更新、删除自己。汽车类显示了这个想法。

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 万个对象,并且由于正在进行的垃圾收集量,对象创建的数量正在影响性能。还有很多这些对象是完全暂时的,用于简单地将数据传递到存储库。

我已经阅读了似乎可能适合我需要的享元模式。而且我还阅读了有关对象池和相关代码的信息。

我遇到的问题是使用池创建一百万个 Car 对象,或者结合Object 的原则将 Flyweight 的数据外部化,应该维护它自己的数据和数据访问

关于如何做到这一点的任何想法?

4

1 回答 1

1

确保您的对象生成确实产生影响。对象生成和 GC 在 sql server 中很便宜,并且您涉及到一个数据库。IO 确信aprofilder 会向您展示影响您的性能的不是对象的创建和破坏,而是首先拉动了 100 万个对象。

事实上,拉动对象应该比创建对象并销毁它慢 1000 倍。

特别是带有荒谬的低效代码,例如

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

这是每辆车的哈希表查找。存储字段的索引(或知道它,它不会在 sql 运行之间改变)并使用索引呢?仅这一点就会比任何其他方法给你带来更多。尤其是如果您还发出一百万条单独的 SQL 语句 - 正如您似乎所做的那样。

像往常一样进行性能优化:RUN A PROFILER。在您的情况下,您 100% 错误地认为您在浪费时间。您会发现对象创建和 gc 甚至没有出现在前 10 名性能浪费者中。

于 2010-12-06T16:45:16.833 回答