【发布时间】:2010-09-21 00:38:15
【问题描述】:
今天在一次编程讨论中,我和一个朋友有点困惑。例如,我们创建了一个虚构的问题,即有一个包含 n 个随机整数(通常为 1.000.000)的List<int>,并希望创建一个函数来返回所有整数的集合,其中包含多个整数。很简单的东西。我们创建了一个 LINQ 语句来解决这个问题,以及一个基于普通插入排序的算法。
现在,当我们测试代码运行的速度时(使用System.Diagnostics.StopWatch),结果令人困惑。 LINQ 代码不仅性能优于简单排序,而且运行速度也比 单个 foreach/for 更快,在旁道上,我认为编译器应该一起发现并删除)。
如果我们在程序的同一执行过程中生成一个新的随机数List<int> 并再次运行 LINQ 代码,则性能将提高几个数量级(通常是千倍)。空循环的性能当然是一样的。
那么,这里发生了什么? LINQ 是否使用并行性来胜过正常循环?这些结果怎么可能? LINQ 使用以 n*log(n) 运行的快速排序,根据定义,它已经比 n 慢。
第二次运行的性能飞跃发生了什么?
我们对这些结果既困惑又好奇,并希望社区提供一些澄清的见解,以满足我们自己的好奇心。
【问题讨论】:
-
请贴一些代码。
-
也许你可以分享你的测试?
-
发布您的代码。你可能没有考虑deferred execution。
-
我非常有兴趣查看该代码并亲自使用它......但你说它甚至优于空循环这一事实强烈表明你没有在正确的地方停止观看代码,根据 Matthew Flaschen 的评论。
-
“Linq 使用以 nlog(n) 运行的快速排序,根据定义,它已经比 n 慢。”不对。 nlog(n)渐近地比 n 慢,但是常数因子可能会导致在实践中,n*log(n) 算法比线性算法更快某些数据集。
标签: c# linq algorithm performance sorting