今天在一次编程讨论中,我和一个朋友有些困惑。我们举了一个虚构的问题作为例子:有一个由n个随机整数(通常为100万)组成的List,我们想创建一个返回所有重复出现的整数集合的函数。这是相当简单的事情。我们创建了一个LINQ语句来解决这个问题,还有一个基于插入排序的算法。
现在,当我们测试代码运行速度时(使用System.Diagnostics.StopWatch),结果令人困惑。不仅LINQ代码比简单的排序要快,而且它比只对列表进行单次循环且没有任何操作的单个foreach/for循环也要快(顺带一提,我认为编译器应该能够发现并完全删除这些操作)。
如果我们在同一程序执行中生成新的随机数List并再次运行LINQ代码,则性能将增加数千倍。空循环的性能当然相同。
那么,这里到底发生了什么?是LINQ使用并行处理来优化普通循环吗?这些结果怎么可能呢?LINQ使用快速排序,其运行时间为n*log(n),根据定义已经比n慢了。
第二次运行时的性能飞跃是怎么回事?
我们对这些结果感到困惑和好奇,并希望从社区中获得一些澄清性见解,以满足我们自己的好奇心。
现在,当我们测试代码运行速度时(使用System.Diagnostics.StopWatch),结果令人困惑。不仅LINQ代码比简单的排序要快,而且它比只对列表进行单次循环且没有任何操作的单个foreach/for循环也要快(顺带一提,我认为编译器应该能够发现并完全删除这些操作)。
如果我们在同一程序执行中生成新的随机数List并再次运行LINQ代码,则性能将增加数千倍。空循环的性能当然相同。
那么,这里到底发生了什么?是LINQ使用并行处理来优化普通循环吗?这些结果怎么可能呢?LINQ使用快速排序,其运行时间为n*log(n),根据定义已经比n慢了。
第二次运行时的性能飞跃是怎么回事?
我们对这些结果感到困惑和好奇,并希望从社区中获得一些澄清性见解,以满足我们自己的好奇心。