Ped*_*ery 5 c# linq sorting algorithm performance
在今天的编程讨论中,我和朋友有点困惑.作为一个例子,我们创建了一个虚构的问题,即具有List<int>n个随机整数(通常为1.000.000)并且想要创建一个函数,该函数返回有多个整数的集合.很简单的东西.我们创建了一个LINQ语句来解决这个问题,以及一个基于普通插入排序的算法.
现在,当我们测试代码运行的速度(使用System.Diagnostics.StopWatch)时,结果令人困惑.LINQ代码不仅优于简单排序,而且运行速度比单个 foreach/for只运行列表的单个循环要快,并且内部没有任何操作(在侧轨上,我认为编译器应该是发现并完全删除).
如果我们List<int>在同一个程序执行中生成一个新的随机数并再次运行LINQ代码,那么性能将提高几个数量级(通常为千倍).空循环的性能当然是相同的.
那么,这里发生了什么?LINQ使用并行性是否优于正常循环?这些结果怎么可能呢?LINQ使用以n*log(n)运行的quicksort,其定义已经慢于n.
第二轮的性能飞跃发生了什么?
我们对这些结果感到困惑和兴趣,并希望从社区中获得一些澄清的见解,只是为了满足我们自己的好奇心.
tva*_*son 13
毫无疑问,你实际上没有执行过查询,你只是定义了它.LINQ构造一个表达式树,在您执行需要迭代枚举的操作之前,该表达式树不会被实际评估.尝试向LINQ查询添加ToList()或Count()操作以强制评估查询.
根据您的评论,我希望这与您所做的类似.注意:我没有花时间搞清楚查询是否尽可能高效; 我只想要一些查询来说明代码的结构.
var dataset = ...
var watch = Stopwatch.StartNew();
var query = dataset.Where( d => dataset.Count( i => i == d ) > 1 );
watch.Stop(); // timer stops here
foreach (var item in query) // query is actually evaluated here
{
... print out the item...
}
Run Code Online (Sandbox Code Playgroud)