Объединение объектов и CSLA Framework

У меня есть приложение, которое следует основной методологии в рамках 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();
        // ...
    }
}   

Приложение создает и уничтожает более 1 миллиона объектов, а количество создаваемых объектов влияет на производительность из-за продолжающейся сборки мусора. Также многие из этих объектов являются полностью временными и используются для простой передачи данных в хранилище.

Я читал про модель в навесном весе, которая, кажется, может удовлетворить мои потребности. И я также читал об объединении объектов и связанном коде.

У меня проблемы с созданием миллиона объектов Car с использованием пула или извлечением данных для наименьшего веса в сочетании с принципом объекта, который должен поддерживать свои собственные данные и доступ к данным.

Есть идеи, как этого добиться?

1 ответ

Убедитесь, что ваше поколение объектов действительно влияет. Генерация объектов и GC - это CHEAP на сервере SQL, и у вас есть база данных. Я уверен, что apofilder покажет вам, что это НЕ ОБРАБОТКА и разрушение объектов, которые влияют на вашу производительность, но в первую очередь тянут 1 миллион объектов.

Фактически, вытягивание объекта должно быть в 1000 раз медленнее, чем создание объекта и его уничтожение.

Особенно смешной неэффективный код, такой как

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

который является хеш-таблицей для каждого автомобиля. Как насчет хранения индекса поля (или, зная его, он не меняется между запусками sql) и использования индекса? Одно это принесет вам больше, чем любой другой подход. Особенно, если вы также выпустите миллион отдельных операторов SQL - как вы, кажется, делаете.

Как всегда, когда выполняете оптимизацию производительности: ЗАПУСТИТЕ ПРОФИЛЬ. В вашем случае вы на 100% ошибаетесь в том, что теряете время. Вы обнаружите, что создание объектов и gc даже не отображаются в топ-10 потерь производительности.

Другие вопросы по тегам