这两天有空,想玩下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的查询效率更高,是不是我的查询方式有什么问题

解决方案 »

  1.   

    Linq to Entity Framework的优势应该是减少基础的CURD操作,让程序员更关注与逻辑部分。
    它的缺点就是性能会下降。
    所以“查询效率更高”应该不是指“查询速度更高”。
      

  2.   


    我记错了,是非官方的,但如果真像这篇文章所写,EF效率不管是读取还是CRUD都是非常快的
    http://chenjilv.blog.163.com/blog/static/21037586200932103441917/
      

  3.   

    查看生成的SQL语句可以多表联合查询测试 在看看时间。
      

  4.   


    刚刚接触EF,请问这位兄台如何查看SQL
      

  5.   

    看他说的挺玄乎的,一个什么view.cs被缓存起来了。
    建议你自己做个测试。
      

  6.   

    实验用PC:CPU i7 RAM 4G土豪啊。。
      

  7.   

    你的例子中,EF获取的数据对象是强类型的,而Dataset则不是,把你的Dataset也改为强类型的试试
      

  8.   

    用SQL Profiler查过了,语句几乎没有差异,只不过EF生成的东西把字段名显式化了而已
    即把Select * from marcTest变成了SELECT [Extent1].[no] AS [no], [Extent1].[grp] AS [grp], [Extent1].[cont] AS [cont] FROM [dbo].[marcTest] AS [Extent1]
      

  9.   


    明星就是明星,吴大说得在理,改成强类型后EF的效率好于DS,大概比强类型的DS提高20%的效率
    如此看来,还是弱类型的DS效率最高罗.....
      

  10.   


    谢谢你对这贴的支持,不过在这里为了作压力实验是故意取10w条,项目中当然不会这么作我的意思是我刚刚接触EF,不知道EF查询语法的一些detail,希望有经验的兄台可以指教。
      

  11.   

    1 ef自动生成的sql语句应该是最优的
    2 ef查询速度慢的原因是因为ef把查询数据转换为强类型的对象集合消耗比dataset方式大
      

  12.   

    个人感觉 EF这种ORM 主要就是减少CRUD 这种重复性操作的  ORM在处理大数据量时 感觉确实不快 但开发效率提高了
      

  13.   


    呵呵,我也觉得这里叫它弱类型有点不妥,暂时也不知道叫。无所谓了
    按你的方法作了实验,在小部分修改数据的情况下用DS快得多,用时大概是EF的5分之一但在数千条的UPDATE情况下,EF终于获得了优势。我用的取4000条数据遍历更改IQueryable,最后用EF中SaveChanges提交。DataSet是遍历更改取得的DataTable,最后用DataAdapter.update提交。结果在我的机器上EF方式大概是9500ms,DataSet方式大概是10200ms。
      

  14.   

    这没啥好比的,EF必定比原始的ADO.NET操作要慢的。EF底层是调用ADO.NET,速度损失都在转换成实体对象这里。
      

  15.   


    作这个测试纯粹是在为项目考虑是不是要转EF,关键是有这篇把EF吹得很神的文章
    和蛮多公司一样,我这里也已经有一套用DataSet进行开发的办法了,开发效率并不低
    所以我更关心EF的执行效率,也许真有一套令到EF效率如那篇文章一样高的办法,只是我们不知道罢鸟。
    这篇帖子本就是为了抛砖引玉
      

  16.   

    我测试了下DataSet\MS Entity Framework\PDF.NET 在循环100次读取1万多条数据的情况下的测试结果:
    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最有优势