测试Entity Framework 6比传统Ado.net性能差多少

测试环境:

硬件: Intel I5 4核 +8G内存。

软件: Windows 7 + vs2013 SP2 + EF6.1 + MVC5.1

数据库: vs2013自带的sql express 2012.

测试过程:

1. 新建一默认模板的MVC项目,在Models中添加如下代码并建立对应的库表:

    [Table("Person")]
    public class Person
    {
        public int Id { get; set; }
        public string UserName { get; set; }
        public DateTime RegTime { get; set; }
        public DateTime Birthdate { get; set; }
        public string Mark { get; set; }
    }

这里有一个有趣的插曲,开始报错找不到“ado.people",纳闷呢,怎么EF这么”聪明“,自动地认为表名是和Person对应的People?
不管了,用[Table]的属性强制固定住。

2. 在HomeController里新建两个Action,一个是管插入Person的,一个是查询Person的:

using EFXpoAdoCompare.Models;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace EFXpoAdoCompare.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult About()
        {
            ViewBag.Message = "Your application description page.";

            return View();
        }

        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";

            return View();
        }

        /// <summary>
        /// 使用EF保存数据
        /// </summary>
        /// <param name="persons"></param>
        void EFSave(Person[] persons)
        {
            ApplicationDbContext db = new ApplicationDbContext();
            db.Persons.AddRange(persons);
            db.SaveChanges();
        }

        /// <summary>
        /// 保用ado保存数据
        /// </summary>
        /// <param name="persons"></param>
        void AdoSave(Person[] persons)
        {
            SqlConnection conn = new ApplicationDbContext().Database.Connection as SqlConnection;
            conn.Open();
            using (SqlTransaction trans = conn.BeginTransaction())
            {
                SqlCommand cmd = new SqlCommand(@"INSERT INTO Person (Birthdate,RegTime,UserName,Mark)
VALUES(@Birthdate,@RegTime,@UserName,@Mark)", conn, trans);
                cmd.Parameters.Add("Birthdate", System.Data.SqlDbType.Date);
                cmd.Parameters.Add("RegTime", System.Data.SqlDbType.DateTime);
                cmd.Parameters.Add("UserName", System.Data.SqlDbType.NVarChar);
                cmd.Parameters.Add("Mark", System.Data.SqlDbType.NVarChar);

                foreach (var p in persons)
                {
                    cmd.Parameters["Birthdate"].Value = p.Birthdate;
                    cmd.Parameters["RegTime"].Value = p.RegTime;
                    cmd.Parameters["UserName"].Value = p.UserName;
                    cmd.Parameters["Mark"].Value = p.Mark;

                    cmd.ExecuteNonQuery();
                }
                trans.Commit();
            }
            conn.Close();
        }

        /// <summary>
        /// EF查询数据
        /// </summary>
        /// <param name="persons"></param>
        void EFSearch(Person[] persons)
        {
            ApplicationDbContext db = new ApplicationDbContext();
            var list = db.Persons.Where(p => p.UserName.CompareTo("d") >= 1).Take(_num).ToList();
            ViewBag.List = list;
        }

        /// <summary>
        /// Ado查询数据
        /// </summary>
        /// <param name="persons"></param>
        void AdoSearch(Person[] persons)
        {
            SqlConnection conn = new ApplicationDbContext().Database.Connection as SqlConnection;
            conn.Open();
            string sql = "SELECT TOP " + _num + " * FROM Person WHERE UserName >= ‘d‘";
            SqlCommand comm = new SqlCommand(sql, conn);
            List<Person> ps = new List<Person>();
            using (SqlDataReader reader = comm.ExecuteReader())
            {
                while (reader.Read())
                {
                    ps.Add(new Person()
                    {
                        Birthdate = (DateTime)reader["Birthdate"],
                        Id = (int)reader["Id"],
                        UserName = (string)reader["UserName"],
                        Mark = (string)reader["Mark"],
                        RegTime = (DateTime)reader["RegTime"],
                    });
                }
            }
            ViewBag.List = ps;
            conn.Close();
        }

        public ActionResult SearchPerson(int? num)
        {
            if (num == null) num = 1000;
            _num = num.Value;
            PersonsCreater pc = new PersonsCreater(_num);

            pc.OnPersonsSaving = AdoSearch;
            ViewBag.AdoMS = pc.SavePersons();

            pc.OnPersonsSaving = EFSearch;
            ViewBag.EFMS = pc.SavePersons();

            return View();
        }

        int _num;
        public ActionResult CreatePerson(int? num)
        {
            if (num == null) num = 1000;
            _num = num.Value;
            PersonsCreater pc = new PersonsCreater(_num);

            pc.OnPersonsSaving = AdoSave;
            ViewBag.AdoMS = pc.SavePersons();

            pc.OnPersonsSaving = EFSave;
            ViewBag.EFMS = pc.SavePersons();

            return View();
        }
    }

    class PersonsCreater
    {
        int _num;

        public PersonsCreater(int num) { _num = num; }

        public Action<Person[]> OnPersonsSaving;
        Person[] CreatePersons()
        {
            Person[] persons = new Person[_num];
            Random rand = new Random();
            for (int i = 0; i < _num; i++)
            {
                persons[i] = new Person()
                {
                    Birthdate = DateTime.Today.AddDays(-rand.Next(365 * 20, 365 * 50)),
                    RegTime = DateTime.Now.AddSeconds(-rand.Next(0, 86400 * 365)),
                    UserName = Guid.NewGuid().ToString(),
                    Mark = "My Mark:" + Guid.NewGuid().ToString(),
                };
            }
            return persons;
        }

        Stopwatch sw = new Stopwatch();
        public long SavePersons()
        {
            var persons = CreatePersons();

            sw.Restart();
            OnPersonsSaving(persons);
            sw.Stop();
            return sw.ElapsedMilliseconds;
        }
    }
}

3.添加视图,配置路由(此处暂且不表,重点不在这儿)试运行通过。

4.开始测试:

测试结果(插入数据, 单位:ms):

 条数  100 1000 3000 10000 100000
EF  31  196  649  2955 22714
Ado  12  128  245  1044 11051

测试结果(查询数据, 单位 ms):

 条数  100 1000 3000 10000 100000
EF  4  11  24  50 522
Ado  3  6  13  30 169

我先用debug版本,在vs环境下调试,结果比Release版本不调试,速度至少慢了10倍。所以大家在生产环境部署时,一定要用Relase编译你的程序,切记切记。

以上数据都是Release下的运行结果。

在以上查询数据的结果中, 数据量越小,测试结果越不规则,有时甚至出现ef比ado还快的情况。

测试结论: 在通常的小数据量应用中,EF和Ado的差别可以忽略不计。只有在大规模插入数据时,EF性能才会明显落后于传统ado。

测试Entity Framework 6比传统Ado.net性能差多少

时间: 2024-10-10 05:57:21

测试Entity Framework 6比传统Ado.net性能差多少的相关文章

使用Entity Framework时要注意的一些性能问题

自从我用了EF,每次都很关心是否有潜在的性能问题.所以每次我写LINQ查询,都会使用SQL Profiler看一下实际生成的SQL语句,以便发现潜在的性能问题.也强烈建议大家这么去做,以免日后软件大了出了问题很难查. 一.只选择某列或某些列 有些时候,在C#里写LINQ虽然看着舒服,但性能不一定好,所以有必要做一些调整.比如这种情况: 我需要知道一篇文章的点击数,仅此而已,我可能会写: context.Post.FirstOrDefault(p => p.Id == postId).Hits;

Entity FrameWork 与 NHibernate

  1 Nhibernate 展示了NHibernate在数据库和用程序之间提供了一个持久层. 应用程序自己提供ADO.NET连接,并且自行管理事务.NHibernate体系结构如图1-51所示.它体现了NHibernate如何使用数据库和配置文件数据来为应用程序提NHibernate 供持久化服务(和持久化的对象). SessionFactory(NHibernate.IsessionFactory):它是Session的工厂,是ConnectionProvider的客户.可以持有一个可选的(

Entity Framework 4.1/4.3 之一 (概念篇)

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 Entity Framework 4.1/4.3 之一 (概念篇) 前序: 大家好,我都想死你们了.因为我想写个Entity Framework 系列的文章,所以在之一这里我写了下前序,一方面讲一下我写系列文章的出发点,二方面讲一下写的思路.很

Entity Framework(EF)(一)之database first

1.EF简介ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案.该框架曾经为.NET Framework的一部分,但version 6之后从.NET Framework分离出来. EF是微软开发的一款ORM框架.ORM框架能够自动实现Entity实体的属性与关系型数据库字段的映射,增删改查的sql脚本由ORM来自动生成,使我们编码时不用考虑数据库数据结构,而是以操作实体对象的形式来完成与数据库的交互.与

深入了解Entity Framework框架及访问数据的几种方式

一.前言 1.Entity Framework概要 Entity Framework是微软以ADO.NET为基础所发展出来的对象关系映射(O/R Mapping)解决方案.该框架曾经为.NET Framework的一部分,但Version 6之后从.NET Framework分离出来,可通过NuGet获取. Entity Framework利用抽象化数据结构的方式,将每个数据库对象都转换成应用程序对象 (Entity),而数据字段都转换为属性 (Property),关系则转换为结合属性 (Ass

[原创]Entity Framework查询原理

前言 Entity Framework的全称是ADO.NET Entity Framework,是微软开发的基于ADO.NET的ORM(Object/Relational Mapping)框架.Entity Framework的主要特点:1. 支持多种数据库(Microsoft SQL Server, Oracle, and DB2):2. 强劲的映射引擎,能很好地支持存储过程:3. 提供Visual Studio集成工具,进行可视化操作:4. 能够与ASP.NET, WPF, WCF, WCF

灵动思绪EF(Entity FrameWork)

参考页面: http://www.yuanjiaocheng.net/entity/mode-first.html http://www.yuanjiaocheng.net/entity/database-first.html http://www.yuanjiaocheng.net/entity/choose-development-approach.html http://www.yuanjiaocheng.net/entity/query-with-edm.html http://www.

在Entity Framework 4中映射现有实体类(POCO)

Entity Framework的全称是ADO.NET Entity Framework,是微软开发的基于ADO.NET的ORM(Object/Relational Mapping)框架. Entity Framework的主要特点: 1. 支持多种数据库(Microsoft SQL Server, Oracle, and DB2): 2. 强劲的映射引擎,能很好地支持存储过程: 3. 提供Visual Studio集成工具,进行可视化操作: 4. 能够与ASP.NET, WPF, WCF, W

Entity Framework 教程——什么是Entity Framework

什么是Entity Framework 编写和管理ADO.NET是一个繁琐而又无聊的工作.微软为你的应用提供了一个名为"Entity Framework"的ORM框架来自动化管理你的数据库. 微软对Entity Framework给出了以下定义: EF是一个对象关系映射(ORM)框架,它能使开发人员用关系型数据定义特定领域的对象,并且开发人员不再需要编写大量的数据库访问代码.使用Entity Framework,开发人员用Linq帮助他们进行查询,检索出的数据自动生成强类型对象.EF提