Объединение объектов и 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 потерь производительности.