У меня есть хранимая процедура, которая возвращает несколько результирующих наборов и внутри (некоторых) результатов 1000 строк. Я выполняю эту сохраненную процедуру, используя x потоков одновременно, с максимумом y одновременно.Производительность процессора при создании большого количества объектов с помощью SqlDataReader
Когда я только пробежать данные:
using (SqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection))
{
do
{
while (reader.Read())
{
for (int i = 0; i < reader.FieldCount; i++)
{
var value = reader.GetValue(i);
}
}
}
while (reader.NextResult());
}
я получаю достаточную пропускную способность - и CPU. Теперь, очевидно, это бесполезно, поэтому мне нужны некоторые объекты! Хорошо, теперь я изменить его, чтобы сделать что-то вроде этого:
using (SqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection))
{
while(reader.Read())
{
Bob b = new Bob(reader);
this.bobs.Add(b);
}
reader.NextResult();
while(reader.Read())
{
Clarence c = new Clarence(reader);
this.clarences.Add(c);
}
// More fun
}
И моя реализация классов данных:
public Bob(SqlDataReader reader)
{
this.some = reader.GetInt32(0);
this.parameter = reader.GetInt32(1);
this.value = reader.GetString(2);
}
И это работает хуже. Что неудивительно. То, что удивительно, заключается в том, что CPU падает и примерно на 20-25% от общего количества (т. Е. Не 25% от того, что он использовал, он близок к 50% того, что он использовал)! Зачем делать больше работы, бросать процессор? Я не понимаю ... похоже, что где-то есть где-то, но я не понимаю, где? Я хочу получить максимальную отдачу от машины!
EDIT - измененный код из-за плохого примера демонстрационного кода. К сожалению.
ТАКЖЕ: для проверки теории конструктора я изменил реализацию той, которая создает объект. На этот раз он также выполняет цикл for по полям и делает getValue и создает пустой объект. Таким образом, он не делает то, что я хочу, да, но я хотел видеть, является ли проблема с созданием большого количества объектов. Это не так.
SECOND EDIT: похоже, что добавление объектов в список - проблема. CPU сразу же падает, как только я добавляю эти объекты в список. Не знаю, как это улучшить ... (или если это стоит исследовать, первый сценарий, очевидно, глупый)
Спасибо, Тим, но это не полезно; это просто показать, что я делаю. bob & clarence - это, очевидно, вздор. Вы можете предположить, что код не является исключением. Проблема не исключение, проблема в том, что процессор падает. Коллекции не могут быть статическими, так как я использую это ключевое слово Метод не может быть статическим, поскольку он является конструктором .... – peteisace
% Использование ЦП - это одна метрика, которая сообщает вам, как сильно он ударяет по ЦПУ в любой момент - другой во время выполнения. Сколько времени занимает первый пример, и сколько времени занимает второе? –
Второй занимает почти в два раза длиннее (хотя это не полезно без контекста: сколько времени занимает первый, сколько записей и т. Д., Я знаю). я считаю, что первое быстрее, эффективно во всех отношениях. что ожидается - только нижняя утилизация ресурсов не для второго метода. – peteisace