这两天有空,想玩下MS的新技术,下载了EF4.1装好,按ADO.Net的官方案例作了下实验
我的实验用表:4字段,10万条数据
实验用PC:CPU i7 RAM 4G代码如下:
//将注释去掉就是原来的dataset查询方式
class Program
{
static void Main(string[] args)
{
System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
List<marcTest> l;
timer.Start();
using (var db = new ModelContainer1())
{
var m = from mc in db.marcTest
select mc;
l = m.ToList();
}
//SqlConnection conn = new SqlConnection();
//conn.ConnectionString = "Data Source=(local);Initial Catalog=efSample;User ID=sa;Password=*****";
//string sql = "select * from marcTest";
//DataSet ds = new DataSet();
//SqlDataAdapter ada = new SqlDataAdapter(sql, conn);
//ada.Fill(ds);
//int cnt = ds.Tables[0].Rows.Count;
timer.Stop();
Console.WriteLine("time:" + timer.Elapsed.TotalMilliseconds.ToString());
Console.ReadKey();
}
}结果如下:
用EF方式是1350毫秒左右
用dataset方式是350毫秒左右感觉上差异较为明显,我记得微软官方说EF的查询效率更高,是不是我的查询方式有什么问题
我的实验用表:4字段,10万条数据
实验用PC:CPU i7 RAM 4G代码如下:
//将注释去掉就是原来的dataset查询方式
class Program
{
static void Main(string[] args)
{
System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
List<marcTest> l;
timer.Start();
using (var db = new ModelContainer1())
{
var m = from mc in db.marcTest
select mc;
l = m.ToList();
}
//SqlConnection conn = new SqlConnection();
//conn.ConnectionString = "Data Source=(local);Initial Catalog=efSample;User ID=sa;Password=*****";
//string sql = "select * from marcTest";
//DataSet ds = new DataSet();
//SqlDataAdapter ada = new SqlDataAdapter(sql, conn);
//ada.Fill(ds);
//int cnt = ds.Tables[0].Rows.Count;
timer.Stop();
Console.WriteLine("time:" + timer.Elapsed.TotalMilliseconds.ToString());
Console.ReadKey();
}
}结果如下:
用EF方式是1350毫秒左右
用dataset方式是350毫秒左右感觉上差异较为明显,我记得微软官方说EF的查询效率更高,是不是我的查询方式有什么问题
解决方案 »
- 用户控件的问题
- 关于validationsummary的错误提示
- ASP.NET图片上面加lable
- 竞拍怎么实现
- Firefox 中用JavaScript控制Flash的问题
- 请问一个超简单问题
- 将datagrid enable=false以后,datagrid的按钮列(更新和删除)依旧可以用!
- DataSet ds=new DataSet(); dr.Fill(ds); 为什么不能填充到数据集里面呢?
- 请问htmlinputFile是不是服务器端控件?在那里可以找得到?
- 使用ASP.NET写服务器端, 实现与移动端通过json来通信...求告知怎么做
- 怎样用radio控制页面输出
- Response.Cookies.Remove()是干什么用的?
它的缺点就是性能会下降。
所以“查询效率更高”应该不是指“查询速度更高”。
我记错了,是非官方的,但如果真像这篇文章所写,EF效率不管是读取还是CRUD都是非常快的
http://chenjilv.blog.163.com/blog/static/21037586200932103441917/
刚刚接触EF,请问这位兄台如何查看SQL
建议你自己做个测试。
即把Select * from marcTest变成了SELECT [Extent1].[no] AS [no], [Extent1].[grp] AS [grp], [Extent1].[cont] AS [cont] FROM [dbo].[marcTest] AS [Extent1]
明星就是明星,吴大说得在理,改成强类型后EF的效率好于DS,大概比强类型的DS提高20%的效率
如此看来,还是弱类型的DS效率最高罗.....
谢谢你对这贴的支持,不过在这里为了作压力实验是故意取10w条,项目中当然不会这么作我的意思是我刚刚接触EF,不知道EF查询语法的一些detail,希望有经验的兄台可以指教。
2 ef查询速度慢的原因是因为ef把查询数据转换为强类型的对象集合消耗比dataset方式大
呵呵,我也觉得这里叫它弱类型有点不妥,暂时也不知道叫。无所谓了
按你的方法作了实验,在小部分修改数据的情况下用DS快得多,用时大概是EF的5分之一但在数千条的UPDATE情况下,EF终于获得了优势。我用的取4000条数据遍历更改IQueryable,最后用EF中SaveChanges提交。DataSet是遍历更改取得的DataTable,最后用DataAdapter.update提交。结果在我的机器上EF方式大概是9500ms,DataSet方式大概是10200ms。
作这个测试纯粹是在为项目考虑是不是要转EF,关键是有这篇把EF吹得很神的文章
和蛮多公司一样,我这里也已经有一套用DataSet进行开发的办法了,开发效率并不低
所以我更关心EF的执行效率,也许真有一套令到EF效率如那篇文章一样高的办法,只是我们不知道罢鸟。
这篇帖子本就是为了抛砖引玉
Do loop 100 times,Test DataSet and Entity...
by DataSet,use Milliseconds:9966
by PDF.NET EntityQuery,use Milliseconds:8336
by MS Entity Framework,use Milliseconds:15406看来EF还是很慢,PDF.NET最有优势