我比较了两个查询,这两个查询从数据库表中获取一些相当大的数据。对于一个查询,我使用Linq To Sql,对于另一个查询,我通过ADO.NET使用passthrough SQL。
我知道Linq To Sql需要在幕后做很多工作,但它实际在做什么呢?这两个查询获取的数据量相同,但Linq To Sql查询慢了5秒以上,并且多使用了150mb的RAM!
下面是我的测试代码:
使用Linq To Sql:
public void MakeList()
{
int start = Environment.TickCount;
var document = from d in _dm.tDokuments select d;
List<tDokument> documentList = document.ToList();
int end = Environment.TickCount;
GridView1.DataSource = documentList;
GridView1.DataBind();
Label1.Text = (end - start).ToString();
}透传SQL + ADO.NET:
public void MakeList()
{
int start = Environment.TickCount;
SqlCommand sqlCommand = new SqlCommand("SELECT * FROM tDokument", _connection);
SqlDataAdapter da = new SqlDataAdapter(sqlCommand);
DataSet ds = new DataSet();
da.Fill(ds);
int end = Environment.TickCount;
GridView1.DataSource = ds;
GridView1.DataBind();
Label1.Text = (end - start).ToString();
}发布于 2009-11-23 01:06:06
Linq2Sql返回强类型的对象,当数据集被填充时,本质上相当于一个哈希表。
在Linq中,数据的填充和数据到GridView的绑定使用了大量的反射来生成所需的结果。
在第二段代码中,数据被加载到dataset并绑定到GridView。这本质上是加载一个包含要绑定的数据和查找的哈希表。
哈希表操作总是比反射快。对于少量的数据,不会有明显的差异,但对于大量的数据,您将看到Linq中反射的影响。
发布于 2009-11-23 00:54:57
您是否查看过使用Profiler发送到SQL Server的实际SQL?
在这种情况下,我怀疑是客户端处理它的方式(DataSet和List)造成了差异,但我一点也不是c#专家。
发布于 2009-11-23 01:12:33
捕获并分析Linq To SQL示例中通过网络发送的Sql语句。SQL事件探查器将完成此任务。
使用Management Studio直接针对SQL Server运行示例1和示例2中的这两条语句。很可能您在查询计划中看不到任何实质性的区别。
我认为大部分时间都花在构造C#对象(我认为是Jason's answer nails it)上。
https://stackoverflow.com/questions/1779220
复制相似问题