Почему C# List <T>Add метод очень медленный? - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть проект ASP. NET MVC, использующий Dapper для чтения данных из базы данных, и мне нужно экспортировать в Excel.

Dapper работает быстро! ExecuteReader занимает всего 35 секунд.

Но list.Add(InStock); тратит слишком много времени! Более 1020 секунд!

У вас есть идеи, почему это так?

public List<InStock> GetList(string stSeId, string edSeId, string stSeDay, string edSeDay, string qDate)
{
    List<InStock> list = new List<InStock>();
    InStock InStock = null;

    IDataReader reader;

    using (var conn = _connection.GetConnection())
    {
        try
        {
            conn.Open();
            //******************Only 35 seconds*****
            reader = conn.ExecuteReader(fileHelper.GetScriptFromFile("GetInStock"),
                 new { STSeId = stSeId, EDSeId = edSeId, STSeDay = stSeDay, EDSeDay = edSeDay, qDate = qDate });
            //*************************************

            //******************Over 1020 seconds**********
            while (reader.Read())
            {
                InStock = new InStock();

                InStock.ColA = reader.GetString(reader.GetOrdinal("ColA"));
                InStock.ColB = reader.GetString(reader.GetOrdinal("ColB"));
                InStock.ColC = reader.GetString(reader.GetOrdinal("ColC"));

                list.Add(InStock);
            }
            //*********************************************
            return list;
        }
        catch (Exception err)
        {
            throw err;
        }
    }
}

My Code In VS Tool

1 Ответ

1 голос
/ 19 февраля 2020

Это база данных.

С Извлечение данных с использованием DataReader ,

DataReader - хороший выбор, когда вы восстановить большие объемы данных, потому что данные не кэшируются в памяти.

Ключевой ключ к вашей проблеме производительности связан с тем, что "данные не кэшируются в памяти". Несмотря на строгую детализацию реализации, каждый вызов Read() получает новые данные из базы данных, в то время как вызов List<InStock>.Add() просто добавляет новый InStock в список.

Существуют порядки величины разницы во время обработки между доступом к диску (даже SSD) по сравнению с RAM. И есть разница в размерах между сетевыми запросами и доступом к диску. На самом деле не существует мыслимого способа, чтобы что-то кроме доступа к базе данных было причиной большей части времени выполнения.

-

В качестве примечания, вы собираетесь превысить максимальное количество строк на листе Excel.

...