IEnumerable.OrderBy().First() 在 .netcore 3.1 中是否做了优化?

咨询区

  • 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

  1. .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
  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),这确实是一个非常大的性能提升,我们的基础库真的是越来越强大 🐂👃。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值