×

Loading...
Ad by
  • 推荐 OXIO 加拿大高速网络,最低月费仅$40. 使用推荐码 RCR37MB 可获得一个月的免费服务
Ad by
  • 推荐 OXIO 加拿大高速网络,最低月费仅$40. 使用推荐码 RCR37MB 可获得一个月的免费服务

link2sql慢,这个得稍微clarify一下

本文发表在 rolia.net 枫下论坛使用者必须注意,linq2sql不外乎就是framework帮你在application里面写了sql statement的wrap.因此,慢也就是application执行sql statement的速度.

先说linq2sql的坏处:

(1)linq2sql很方便,托托拽拽,表达使自己生成,因此引诱初用者喜欢用linq2sql做傻事情,比如一个大循环,里面一行一行update改数,这实际上相当能用batch的时候用cursor,这是大忌讳。

(2)很复杂的luma表达式,做一个数据库复杂操作,一旦business logic有更改,需要重新改表达式,重新编译

(3)数据库表结构或SP参数列表或者返回之列表变化,需要重新update linq2sql xml,并且重新编译

(4)linq2sql是发明出来做data entity级别操作的,硬用它作batch操作,自讨苦吃,比如说删除2000行数据。

再说linq2sql的好处:
(1)linq2sql完全可以call stored proedure并且handle 返回值/返回错误/返回dataset,所以复杂logic或者大batch放在SP里面,就像以前一样

(2)linq2sql的wrap比较健壮,不需要像以前那样开factory开connection闭connection,使用方便

(3)性能如果是call SP就是最好的表现,如果自己做lumda表达式,性能惨不过以前在app端写statement,所以这不是问题(可以自己做百万行的statement update测试)

(4)对小表或者多参数的update,直接上linq2sql table object,非常方便。想象一下以前需要自己维护object大参数列表,要update一个80column的表有多麻烦,现在简单了。



知道了pros & cons会更好的帮助使用者做出选择更多精彩文章及讨论,请光临枫下论坛 rolia.net
Report

Replies, comments and Discussions:

  • 工作学习 / 学科技术讨论 / 上次说了说Paraller.ForEach()的应用,这次再试试PLINQ的威力
    本文发表在 rolia.net 枫下论坛废话不多说了,先看一段小程序

    假设我有一个目录,
    string folder = @\"c:\\xxxx\";
    里面有数十个子目录,这数十个子目录里面有成百上千个.txt文件,我想遍历这所有的.txt文件,并把其中包含“Hello World!” string 的行都挑出来放在一个数组 Array里面。于是写了这么个小程序

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Xml.Linq;
    using System.Text;
    using System.Diagnostics;
    using System.IO;
    using System.Threading;

    static void Lab2()
    {
    Stopwatch stopWatch = new Stopwatch();
    stopWatch.Start();

    string folder = @\"c:\\xxxx\";
    var rawLines =
    Directory.GetFiles(folder, \"*.txt\", SearchOption.AllDirectories)
    .SelectMany(file =>(new FileInfo(file)).LoadRawlines()
    .Where(s => s.Contains(\"Hello World!\"))).ToArray();

    Console.WriteLine(rawLines);

    stopWatch.Stop();
    Console.WriteLine(\"done.. time lasted: \"+stopWatch.Elapsed.ToString());
    }

    这是按照正常的LINQ写法来写的,扫描1100个文件,170个Folder,450M .txt 文件,所用时间 52秒

    然后,把中间的代码换成PLINQ方式,改成

    var rawLines =
    Directory.GetFiles(folder, \"*.txt\", SearchOption.AllDirectories)
    .AsParallel().SelectMany(file =>
    (new FileInfo(file)).LoadRawlines()
    .AsParallel()
    .Where(s => s.Contains(\"Hello World!\"))).ToArray();

    再次运行,时间为24.8秒,整个查询速度快了1倍以上,而我所作的修改只不过是加了.AsParallel()这么个修饰符,不要小看这个AsParallel(),加上这个修饰符之后,.net的LINQ查询就会工作在并行方式之下,充分利用你的CPU资源,不对,不能说充分,是100%地榨光你的CPU资源,以至于其他的运行在同一台计算机上的程序会变得非常缓慢,这可能是PLINQ的唯一一个缺点

    PLINQ在查询小数量的数据的时候速度反而会慢于普通的LINQ,但是如果涉及到大批量的数据处理,效率会成倍提高

    程序中这条语句
    (new FileInfo(file)).LoadRawlines() ,是我自己写的一个扩展方法,目的是读出一个.txt文件中的所有strings 定义如下:

    public static List<string> LoadRawlines(this System.IO.FileInfo fileInfo)
    {
    List<string> result = new List<string>();
    using (System.IO.StreamReader sr = new System.IO.StreamReader(fileInfo.FullName))
    {
    string s;
    while ((s = sr.ReadLine()) != null)
    {
    result.Add(s);
    }
    }
    return result;
    }

    怎样高效运用CPU的并行处理能力是很多公司比如Google等倾尽全力奋斗的目标,现在被微软一个AsParallel()就搞定了,真是神奇

    Parallel和PLINQ已经是.Net 4.0的基本装备,等VS 2010出来就好了更多精彩文章及讨论,请光临枫下论坛 rolia.net
    • "是100%地榨光你的CPU资源,以至于其他的运行在同一台计算机上的程序会变得非常缓慢" --- Are you sure? Running in parallel doesn't mean it occupies CPU time exclusively.
      • Sorry,主贴有一点错误。PLINQ不会100%占用CPU,其它程序能正常运行。但是Paraller.XXX 系列会100%占用CPU资源。比如你的CPU2个Core,打开Task Manager,你会看到2个Core全都是100%
    • One additional condition, Parallel computing is for taking advantage of multi-core processors. If it’s used in single core machine, the result will be negative.
    • can you explain the useage of "=>"? what's function? thanks.
      • usage.
      • look at Lambda expressions in
      • => 是 Lamda 表达式的组成部分
        比如说
        s => Console.WriteLine(s)
        它是一个匿名函数,意思是有一个输入参数s,函数体有一个 Console.WriteLine(s) 的动作。这是.Net 3.5中新加入的一种语法。s的type是由在他更上一层的IEnumerable<> 来决定的,这叫什么type的智能推断intelligent refer,比如这个例子

        (string[] {"to","mt"}).Select(s=> s.substring(0,2))
        你并没有指定输入参数 s 的type,但是.net 3.5智能的推断出s的type只能是string型的,因为s来源于一个string[]数组

        在.Net 2.0中写出一个和它相同功能的匿名函数是这个样子
        delegate(string s) { rConsole.WriteLine(s); }

        举个小例子

        Enumerable.Repeat("tree", 10).Select(s => s.Substring(0, 2));
        如果用.net 2.0的匿名函数来写,是这个样子
        Enumerable.Repeat("tree", 10).Select( delegate(string s) { return s.Substring(0, 2); } );
        • thanks for sharing the knowledge.
          • hehe, u r welcome, LINQ是很有用的,以前.net 2.0下半个小时或者一个小时的开发工作用LINQ几分钟就完成了,剩下的时间就是听音乐、玩游戏了
            • Is it just for SQL server?
              • 不是的,对数据库操作我尽量避免用LINQ,非常慢,LINQ to SQL只是LINQ Project的一部分。我用LINQ主要操作内存中的object, 或者是XML
                • link2sql慢,这个得稍微clarify一下
                  本文发表在 rolia.net 枫下论坛使用者必须注意,linq2sql不外乎就是framework帮你在application里面写了sql statement的wrap.因此,慢也就是application执行sql statement的速度.

                  先说linq2sql的坏处:

                  (1)linq2sql很方便,托托拽拽,表达使自己生成,因此引诱初用者喜欢用linq2sql做傻事情,比如一个大循环,里面一行一行update改数,这实际上相当能用batch的时候用cursor,这是大忌讳。

                  (2)很复杂的luma表达式,做一个数据库复杂操作,一旦business logic有更改,需要重新改表达式,重新编译

                  (3)数据库表结构或SP参数列表或者返回之列表变化,需要重新update linq2sql xml,并且重新编译

                  (4)linq2sql是发明出来做data entity级别操作的,硬用它作batch操作,自讨苦吃,比如说删除2000行数据。

                  再说linq2sql的好处:
                  (1)linq2sql完全可以call stored proedure并且handle 返回值/返回错误/返回dataset,所以复杂logic或者大batch放在SP里面,就像以前一样

                  (2)linq2sql的wrap比较健壮,不需要像以前那样开factory开connection闭connection,使用方便

                  (3)性能如果是call SP就是最好的表现,如果自己做lumda表达式,性能惨不过以前在app端写statement,所以这不是问题(可以自己做百万行的statement update测试)

                  (4)对小表或者多参数的update,直接上linq2sql table object,非常方便。想象一下以前需要自己维护object大参数列表,要update一个80column的表有多麻烦,现在简单了。



                  知道了pros & cons会更好的帮助使用者做出选择更多精彩文章及讨论,请光临枫下论坛 rolia.net
                  • 化大精力去掌握,没啥特别的优点,我看linq2sql没啥市场。这精力不如化在.NET的别的领域。
                    • 呵呵,倒是没花啥精力
                      像数据库应用这种东西,没什么神秘的,搞两下,测试几个小程序很快就上手了。1个下午做几个小小的测试,发现linq2sql能解决我们的pain,就决定整体测试,整个dal 中间层替换,xcopy,用户根本不受影响,现在效果很好,维护性比以前好很多,性能并不差,这些都是value. 应用规模也ok, 6000人的内部应用。现在技术选择越来越多,很多老的技术老的项目摆在那里,不改也罢。但是如果频繁维护,或者有新的项目上马,值得考虑新技术。在自身资源许可的时候积极尝试新东西不是坏事。毕竟新技术的发明不是胡乱生造出来的。
                      • 在application里面写sql statement肯定不是个好主意;用linq2sql call stored proedure是节外生枝,ADO.NET简单明了;有了关键字using就无需担心connection没关闭。
                        • using只是一个option,但有问题。
                          简单应用,可以不care,但是设想一下,connection有问题,using只能保证connection close,但是不能做其他的事情,比如email给sysadmin,关闭file handles(这种OS资源释放,不能指望default gabbage collection,太慢,必须给hint,尽快释放)
                          robust应用还是需要 try-catch-finally做事情。

                          上面关于linq2sql的帖子是针对搂主讲performance的,point就是,适当的使用,linq2sql没有什么性能问题。

                          linq2sql的发明的重点是entitiy framework,就是操作表按照object来做,可以type safe.这是最主要的benefit.

                          entity framework本身不是新鲜事,但是.NET 3.0以后作为.NET原生built-in,这就是好的事情,比起以前自己做这个enttiy framework和3rd party的solution,原生方案毕竟是大厂嫡系。
                          • 哈哈,可以说linq2SQL任何优点:strong type,intellisense,productivity,etc. 就不能说没影响性能。另外using不能email给sysadmin,但能关闭file handles。
                            • 对企业团队说,这是新技术,对小公司和个人,这是泡沫.:-)
                              • 牛哥牛。把前贴删了。在网上谈技术和在单位谈技术一样,不招人喜欢。
                                • 别介意, 对于.net technology, 我是小学一年级,还逃学了...:-) 用java, 先做一个abstract adapter, 然后做具体数据库的implementation, 再把SQl Query 统统放进web.xml, 每个portlet 的具体query在数据库搜索. .net 也可以有类似的方案?
                    • 最近在看一些LINQ to Entity Framework的资料,微软确实准备放弃继续更新LINQ to SQL,转而全力支持LINQ to Entity Framework
    • The Parallel Patterns Library will also be available for C++ developers.
    • 看来ms这两年来做了不少小花招, 可惜这些东西在真正的企业级的运用中没有一点价值. 没有贬低LZ的意思.