咨询区
Matthew Watson:
我记得 .net core 中有一个版本对下面的场景做了一个优化,代码如下:
int smallest = new[]{ 7, 2, 4, 6, 0, 1, 6, 9, 8 }.OrderBy(i => i).First();
在很早之前它的时间复杂度是 O(N.Log(N))
,现在已经优化成 O(N)
了。
为了验证,我用 .NET Core 和 .NET Framework 来跑下面的这段代码,参考如下:
using System;
using System.Collections.Generic;
using System.Linq;namespace Demo
{static class Program{static void Main(){int[] test = { 7, 2, 4, 6, 0, 1, 6, 9, 8 };var comparer = new Comparer();var _ = test.OrderBy(i => i, comparer).First();}}class Comparer : IComparer<int>{public int Compare(int x, int y){Console.WriteLine($"Comparing {x} with {y}");return x.CompareTo(y);}}
}
如果你想试试的话,可以参考如下两个在线工具。
.NET Framework: https://dotnetfiddle.net/XItXYL
.NET Core: https://dotnetfiddle.net/swlc0O
.NET Framework 4.8
Comparing 0 with 7
Comparing 0 with 8
Comparing 0 with 9
Comparing 0 with 6
Comparing 0 with 1
Comparing 0 with 0
Comparing 0 with 2
Comparing 0 with 6
Comparing 0 with 4
Comparing 0 with 2
Comparing 0 with 0
Comparing 7 with 2
Comparing 7 with 4
Comparing 7 with 6
Comparing 7 with 7
Comparing 7 with 8
Comparing 7 with 9
Comparing 7 with 6
Comparing 7 with 1
Comparing 7 with 7
Comparing 7 with 1
Comparing 9 with 7
Comparing 9 with 9
Comparing 9 with 8
Comparing 7 with 7
Comparing 7 with 8
Comparing 7 with 7
Comparing 6 with 2
Comparing 6 with 4
Comparing 6 with 6
Comparing 6 with 1
Comparing 6 with 6
Comparing 6 with 6
Comparing 6 with 1
Comparing 6 with 6
Comparing 6 with 6
Comparing 4 with 2
Comparing 4 with 4
Comparing 4 with 1
Comparing 2 with 2
Comparing 2 with 1
.NET Core 3.1
Comparing 2 with 7
Comparing 4 with 2
Comparing 6 with 2
Comparing 0 with 2
Comparing 1 with 0
Comparing 6 with 0
Comparing 9 with 0
Comparing 8 with 0
最后提一下,大家记得在哪里看到这样的文档记载吗?不是官方的就不要发了。
回答区
Matthew Watson:
确实,对这个进行优化的文档说明是有的,可以参考下 Github: https://github.com/dotnet/runtime/issues/14867
上的这个讨论和最后的编码实现。
点评区
由 O(N.Log(N))
变成 O(LogN)
,这确实是一个非常大的性能提升,我们的基础库真的是越来越强大 🐂👃。