• 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 还是可以用的,起码中小型项目可以放心使用。

    大家如有好的建议或者意见欢迎拍板。

     

     

     

     

  • 相关阅读:
    设备内核PROBE函数何时调用
    对象最小JAVA对象排序之获取最小负载数
    网页内容设置有用的meta设置解决网页内容不能适应某些浏览器宽度的问题
    定义提示【Cocos2DX 游戏引擎】常见错误备忘
    绑定列ORA24816: 在实际的 LONG 或 LOB 列之后提供了扩展的非 LONG 绑定数据
    PowerShell
    boot.ini 调试模式
    windbg远程调试
    TLogger日志类
    pageheap检查对操作错误
  • 原文地址:https://www.cnblogs.com/vipstone/p/2508209.html
Copyright © 2020-2023  润新知