LINQ能不能用系列(二)LINQ to SQL 效率比对
前言
很多人听说过LINQ TO SQL与ADO.NET传统方式用于不同的环境,LINQ TO SQL与ADO.NET传统方式也没有可比性,就像公交车与私家车一样,虽然是车但用途完全不同,但很少有人去探究,究竟为什么他们不同,他们不同的原因是什么,这我觉得是一个好的程序和一个普通程序最主要的区别之一。下面一起来看LINQ TO SQL效率到底如果吧。
内容
测试环境:net framework 4.0 + Sql Server 2008
测试用途:100w条数据 like 查询,原因添加、修改、删除消耗资源与时间相对较少,不易测试,查询里面最消耗时间的无非就是 like 与 in查询,我们就采用like 相对比较耗时与耗时间的典型来测。
测试数据:100w条测试数据(其中有一条数据有别于其他数据,在数据的最中央)
测试数据图:
测试脚本:
View Code
create database TestDB go use TestDB go create table gameinfo ( gid int identity not null primary key, gamename varchar(250) not null, createtime datetime default getdate(), content text, gametype int ) go declare @count int set @count =0 while @count<1000000 begin insert into gameinfo(gamename,content,gametype) values('游戏战警X' ,'这游戏聊咋哩,点击链接查看游戏战警。',1); set @count=@count+1; end go update gameinfo set gamename='我是第一无二的Dota游戏' where gid=500000 --like查询用 select COUNT(1) as 信息总数 from gameinfo
测试项目图:
核心代码:
GameInfoBLL.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; namespace LINQProject { /// <summary> /// 游戏信息业务处理类(LINQ TO SQL 效率测试用) /// 王磊(Stone) /// 2012.05.18 /// </summary> public class GameInfoBLL { #region 根据游戏名称模糊查询 /// <summary> /// 根据游戏名称模糊查询 /// </summary> /// <param name="name">游戏名称呢个</param> /// <returns>List<GameInfoModel></returns> public static List<GameInfoModel> GetGameInfoByGname(string name) { List<GameInfoModel> list = new List<GameInfoModel>(1000000); string sql = "select * from gameinfo where gamename like @gamename"; SqlDataReader dr = null; try { using (dr = DBHelper.GetSqlDataReaderBySql(sql, new SqlParameter[]{ new SqlParameter("@gamename","%"+name+"%") })) { GameInfoModel game = new GameInfoModel(); while (dr.Read()) { game.gid = (int)dr["gid"]; game.gamename = (string)dr["gamename"]; game.createtime = (DateTime)dr["createtime"]; game.content = (string)dr["content"]; game.gametype = (int)dr["gametype"]; list.Add(game); } } } catch (Exception ex) { if (null != dr && !dr.IsClosed) { dr.Close(); } throw ex; } return list; } #endregion } }
DBHelper.cs
View Code
#region 查询信息返回SqlDataReader /// <summary> /// 查询信息返回SqlDataReader /// </summary> /// <param name="sql">查询sql</param> /// <param name="par">SqlParameter 可选参数数组</param> /// <returns>SqlDataReader</returns> public static SqlDataReader GetSqlDataReaderBySql(string sql, params SqlParameter[] par) { using (Conn) { SqlCommand cmd = new SqlCommand(sql, Conn); if (null != par) cmd.Parameters.AddRange(par); try { cmd.Connection.Open(); return cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection); } catch (Exception ex) { cmd.Connection.Close(); throw ex; } finally { cmd.Parameters.Clear(); } } } #endregion
测试类代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; namespace LINQProject { class Program { static void Main(string[] args) { for (int i = 1; i < 10; i++) { Test(i); } Console.Read(); } /// <summary> /// 效率方法测试 /// </summary> private static void Test(int testNumber) { Stopwatch linqWatch = new Stopwatch(); linqWatch.Start(); // LINQ 查询 DataClasses1DataContext db = new DataClasses1DataContext(); var glist = from g in db.gameinfo where g.gamename.Contains("Dota") select g; // foreach 遍历 foreach (var item in glist) { Console.Write("LINQ:" + item.gamename + " "); } linqWatch.Stop(); Stopwatch adoWatch = new Stopwatch(); adoWatch.Start(); // ADO.NET 查询 List<GameInfoModel> list = GameInfoBLL.GetGameInfoByGname("Dota"); // foreach 遍历 foreach (GameInfoModel item in list) { Console.WriteLine("ADO.NET:" + item.gamename); } adoWatch.Stop(); Console.WriteLine("================================结果" + testNumber + "========================================="); Console.WriteLine(String.Format("LINQ 用时:{0} \r\nADO.NET 用时:{1}", linqWatch.ElapsedMilliseconds, adoWatch.ElapsedMilliseconds)); } } }
测试项目下载:点击
结果
如图:
LINQ TO SQL第一次的时候比较消耗资源,原因LINQ第一次初始化比较耗时,之后LINQ查询与ADO.NET几乎一样,在100w条数据下随然数据大同小异,但已经足够说明问题,LINQ TO SQL 还是可以用的,起码中小型项目可以放心使用。
大家如有好的建议或者意见欢迎拍板。
关注下面二维码,订阅更多精彩内容。