为什么C#List 添加方法很慢?

问题描述 投票:-3回答:1

我有一个使用Dapper从数据库读取数据的ASP.NET MVC项目,我需要导出到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

c# .net ado.net dapper generic-list
1个回答
1
投票

这是数据库。

来自Retrieve data using a DataReader

当您检索大量数据时,DataReader是一个不错的选择,因为数据没有缓存在内存中。

您担心性能的关键线索是“因为数据未缓存在内存中”。尽管严格来说是实现细节,但每次对Read()的调用都会从数据库中获取新数据,而List<InStock>.Add()调用只是将新的InStock添加到列表中。

与RAM相比,磁盘访问(甚至是SSD)之间的处理时间差异有几个数量级。并且网络请求和磁盘访问之间存在数量级的差异。实际上,没有一种可以想象的方式,除了数据库访问以外,任何其他因素都是导致您大部分运行时间的原因。

-

作为旁注,您将超出Excel工作表中的maximum number of rows

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.