linq表达式与自己写查找算法效率上有多大差距?

小鸟向前飞 2014-07-30 04:51:57
如题 效率上会不是一个级别的吗?
...全文
467 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
游离失所 2014-07-30
  • 打赏
  • 举报
回复
引用 11 楼 csz_1987 的回复:
[quote=引用 2 楼 lyj224170707 的回复:] 我觉得没区别。。LINQ只不过把算法或条件封装成委托。再在内部去执行这个委托,当满足条件就返回。。 首先要明白LINQ的特性。。 var result=list1.Where(x=>x.age>18)。。这时result相当于一个游标。。当你遍历它的时候,它才会去执行,并且每次只查找1个满足条件的元素,记录下当前位置,然后迭代返回它出去。。但当你多次去遍历result时,它是继续去list1找满足你函数条件的记录。。所以多次使用建议tolist/toArray。。把它加载到内存当中。。 总结就是,单次使用的话,LINQ的这种游标特性是非常优秀的。而多次使用时,我们应该把它tolist/toArray。。把结果加载到内存当中。。 我觉得说LINQ效率低的人都是对LINQ不够理解的人。。LINQ没多神秘。。
频繁的ToList/ToArray会引起频繁的垃圾回收。碰到服务器数据量大或者负载大的时候CPU长期100%。 这在论坛里的一个EntityFramework的帖子有说LINQ时有说到。[/quote] 这是肯定的。。但如果结果你要使用2次或以上,我觉得这时候toList/toArray就很有必要了。。不然你每次都先要查1次,资源消耗更大。。 我总结也说了。。单次使用的话就不理他。。多次使用toList/toArray很有必要
  • 打赏
  • 举报
回复
有人说了,如果 linq 程序故意用错了方法,一定会占用服务器的CPU时间、占用内存。 可是这算是想去告诉别人该如何善用 linq 呢?还是想说 linq 天生就会被用错了呢?
  • 打赏
  • 举报
回复
如果是别人我不敢说,我知道让 lz 在10个月内写100个程序,结果总的来水反正注定是比 linq 差得太远。不论是效率,还是可读性可维护性,都差得远。 经常有人就扯这类问题。它总是问“越是低级的手工打造的东西,是不是越是比高级的自动化生成的东西更有效率?”。这是诡辩。我们当让可以说“理论上是这样的”,但是我们还要说一句“但是你肯定不行”!
csz_1987 2014-07-30
  • 打赏
  • 举报
回复
引用 2 楼 lyj224170707 的回复:
我觉得没区别。。LINQ只不过把算法或条件封装成委托。再在内部去执行这个委托,当满足条件就返回。。 首先要明白LINQ的特性。。 var result=list1.Where(x=>x.age>18)。。这时result相当于一个游标。。当你遍历它的时候,它才会去执行,并且每次只查找1个满足条件的元素,记录下当前位置,然后迭代返回它出去。。但当你多次去遍历result时,它是继续去list1找满足你函数条件的记录。。所以多次使用建议tolist/toArray。。把它加载到内存当中。。 总结就是,单次使用的话,LINQ的这种游标特性是非常优秀的。而多次使用时,我们应该把它tolist/toArray。。把结果加载到内存当中。。 我觉得说LINQ效率低的人都是对LINQ不够理解的人。。LINQ没多神秘。。
频繁的ToList/ToArray会引起频繁的垃圾回收。碰到服务器数据量大或者负载大的时候CPU长期100%。 这在论坛里的一个EntityFramework的帖子有说LINQ时有说到。
vpjian 2014-07-30
  • 打赏
  • 举报
回复
基本上没有差别,我试过将一些复杂Linq语句生成的SQL然后再尝试优化。但是发现基本上没有什么优化的空间。
gomoku 2014-07-30
  • 打赏
  • 举报
回复
Linq要考虑通用性。因此,对特别的数据结构,自己的代码可以更有针对性。比如

List<int> sorted = new List<int>(Enumerable.Range(1, 10000000));

bool hasBigNumberLinq = sorted.Any(x => x > 10000002);  // 循环10000000次
bool hasBigNumber = sorted[sorted.Count - 1] > 10000002;  // 1次

bool has88888Linq = sorted.Any(x => x == 88888);  //循环88888次
bool has88888 = sorted.BinarySearch(88888) >= 0; //约17次
卧_槽 2014-07-30
  • 打赏
  • 举报
回复
linq蛮好的,当你真的上升到要优化Linq效率的时候,你也就不会问这些问题了。
threenewbee 2014-07-30
  • 打赏
  • 举报
回复
只要你写得好,你的程序也可以达到linq的效率。 linq是用C#写的,虽然质量很高,但是并没有用到什么特殊的东西,你照着linq的源代码,写一遍,自己编译,我打包票效率100%和linq一样。 但是有的人写的程序实在不敢恭维。比如http://bbs.csdn.net/topics/390847086 里面的6L。
q107770540 2014-07-30
  • 打赏
  • 举报
回复
你这个问题就好比在问宝马跑的快还是奔驰跑的快 首先宝马和奔驰有很多种车 其次开的人技术水平不一 所以这个问题没有答案
游离失所 2014-07-30
  • 打赏
  • 举报
回复
我是不是跑题了
游离失所 2014-07-30
  • 打赏
  • 举报
回复
就像你拿到一份打印好的纸制成绩单。。里面有200个学生的成绩。。 你找出这200个学生中成绩不及格的学生。。然后发封邮件告诉校长他们的名字。。这时你会怎么做? 1.)打开邮件,点击发送邮件,拿着打印好的成绩单找。发现1个不及格的,就在邮件内容上输入他的名字。全部找完后点发送。爽了。。搞定 2.)拿着打印好的成绩单,找出所有不及格的学生。开个txt记录,或拿张纸抄下来。。之后再把结果输入到邮件内容中,发送。。 1 的好处是我不用东西记录它,因为我只使用1次。。下次要是使用,我只能再继续去找了。。 2 的好处是我耗点资源,用个东西记录它。如果下次还要用,我就可以不用再找1次了。。
exception92 2014-07-30
  • 打赏
  • 举报
回复
那个用着爽 就用那个。
游离失所 2014-07-30
  • 打赏
  • 举报
回复
我觉得没区别。。LINQ只不过把算法或条件封装成委托。再在内部去执行这个委托,当满足条件就返回。。 首先要明白LINQ的特性。。 var result=list1.Where(x=>x.age>18)。。这时result相当于一个游标。。当你遍历它的时候,它才会去执行,并且每次只查找1个满足条件的元素,记录下当前位置,然后迭代返回它出去。。但当你多次去遍历result时,它是继续去list1找满足你函数条件的记录。。所以多次使用建议tolist/toArray。。把它加载到内存当中。。 总结就是,单次使用的话,LINQ的这种游标特性是非常优秀的。而多次使用时,我们应该把它tolist/toArray。。把结果加载到内存当中。。 我觉得说LINQ效率低的人都是对LINQ不够理解的人。。LINQ没多神秘。。
WanderOCN 2014-07-30
  • 打赏
  • 举报
回复
linq的效率高一些,我试过。压力下有50%的性能提升。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧