close
文章出處
內容
前言
很多人聽說過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 還是可以用的,起碼中小型項目可以放心使用。
大家如有好的建議或者意見歡迎拍板。
不含病毒。www.avast.com |
全站熱搜
留言列表