【发布时间】:2020-02-19 02:22:09
【问题描述】:
我有一个 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;
}
}
}
【问题讨论】:
-
Add前面有5条指令,你确定是Add方法耗时吗? -
关于你的基准假设的一件事 - 你有一个涉及数据库的操作和一个由内存数组支持的操作,并且你指向
List<InStock>.Add()作为你的性能罪魁祸首。除非InStockctor 特别密集,否则就是数据库。 -
这个问题说实话没有意义。您要返回多少条记录?
-
根据您的代码 cmets 和图像,听起来您实际上并不是在测量
.Add(),而是在测量所有 7351409 行的整个处理过程。此外,对conn.ExecuteReader的调用可能不会立即加载所有结果,而是依赖reader.Read()来执行此操作。这可以解释两者之间的差异。 -
在调试器下不是你想首先计时你的代码,我不熟悉 Dapper 但我同意对
ExecuteReader()的调用实际上不应该读取任何内容所以这不是一个公平的比较。你甚至需要返回一个完整的List<>,而不是yield return,而不是IEnumerable<>?顺便提一下,catch (Exception err) { throw err; }会掩盖err的来源;要么将其更改为throw;,要么完全删除catch。现在,关于那个 Comic Sans...
标签: c# .net ado.net dapper generic-list