您的位置:首页 > 数据库

LINQ能不能用系列(二)LINQ to SQL 效率比对

2012-05-18 19:26 267 查看

前言

很多人听说过LINQ TO SQL与ADO.NET Entity Framework用于不同的环境,LINQ TO SQL与ADO.NET Entity Framework也没有可比性,就像公交车与私家车一样,虽然是车但用途完全不同,但很少有人去探究,究竟为什么他们不同,他们不同的原因是什么,这我觉得是一个好的程序和一个普通程序最主要的区别之一。下面一起来看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 Entity Framework 查询
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 Entity Framework几乎一样,在100w条数据下随然数据大同小异,但已经足够说明问题,LINQ TO SQL 还是可以用的,起码中小型项目可以放心使用。

大家如有好的建议或者意见欢迎拍板。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: