为什么 C# List<T> 添加方法很慢?
Why is C# List<T> Add method very slow?
我有一个 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;
}
}
}
是数据库。
来自 Retrieve data using a DataReader、
The DataReader is a good choice when you're retrieving large amounts of data because the data is not cached in memory.
关于性能问题的关键线索是 "because the data is not cached in memory"。虽然严格来说是一个实现细节,但每次调用 Read()
都会从数据库中获取新数据,而 List<InStock>.Add()
调用只是将新的 InStock
添加到列表中。
与 RAM 相比,磁盘访问(甚至 SSD)之间的处理时间存在数量级差异。网络请求和磁盘访问之间存在数量级的差异。除了数据库访问之外,没有什么可以想象的方式是您大部分 运行 时间的原因。
--
附带说明一下,您将超过 Excel 工作表中的 maximum number of rows。
我有一个 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;
}
}
}
是数据库。
来自 Retrieve data using a DataReader、
The DataReader is a good choice when you're retrieving large amounts of data because the data is not cached in memory.
关于性能问题的关键线索是 "because the data is not cached in memory"。虽然严格来说是一个实现细节,但每次调用 Read()
都会从数据库中获取新数据,而 List<InStock>.Add()
调用只是将新的 InStock
添加到列表中。
与 RAM 相比,磁盘访问(甚至 SSD)之间的处理时间存在数量级差异。网络请求和磁盘访问之间存在数量级的差异。除了数据库访问之外,没有什么可以想象的方式是您大部分 运行 时间的原因。
--
附带说明一下,您将超过 Excel 工作表中的 maximum number of rows。