首页 > 其他分享 >在 .NET 中的 ConvertAll 和 Select 方法哪个性能好

在 .NET 中的 ConvertAll 和 Select 方法哪个性能好

时间:2024-10-12 14:02:41浏览次数:7  
标签:Status ConvertAll new NET ns public Select

.NET 的 List 中提供了 ConvertAllSelect 两个方法,在开发中实际上应该使用哪一个?

接下来通过基准测试脚本来对比性能。

先编写基准测试脚本:

[MemoryDiagnoser]  
public class BenchmarksTerrible  
{  
    private readonly List<Order> _orders;  
  
    public BenchmarksTerrible()  
    {  
        var random = new Random(420);  
        _orders = Enumerable.Range(1, 100000).Select(_ => new Order { Status = random.Next().ToString() })  
            .ToList();;  
    }  
  
    public static OrderBasicInfo ConvertOrder(Order order) => new() { Status = order.Status };  
    
    public List<OrderBasicInfo> GetOrderBasicInfos() => _orders.ConvertAll(new Converter<Order, OrderBasicInfo>(ConvertOrder));
  
  
  
    [Benchmark]  
    public List<OrderBasicInfo> ConvertAll()  
    {  
        return GetOrderBasicInfos();  
    }  
  
    [Benchmark]  
    public void Select()  
    {  
        var _ = _orders.Select(x => new OrderBasicInfo { Status = x.Status });  
    }  
  
    [Benchmark]  
    public List<OrderBasicInfo> SelectToList()  
    {  
        return _orders.Select(x => new OrderBasicInfo { Status = x.Status })  
            .ToList();  
    }  
}

测试结果如下:

Method Mean Error StdDev Gen 0 Gen 1 Gen 2 Allocated
ConvertAll 4,118,657.86 ns 77,004.920 ns 79,078.383 ns 382.8125 375.0000 132.8125 3200166 B
Select 14.70 ns 0.287 ns 0.330 ns 0.0076 - - 72 B
SelectToList 4,115,770.49 ns 68,067.640 ns 63,670.513 ns 382.8125 375.0000 132.8125 3200174 B

然后将代码的 GetOrderBasicInfos 方法进行如下调整,重新测试。

public List<OrderBasicInfo> GetOrderBasicInfos() => _orders.ConvertAll(ConvertOrder);  

测试结果如下:

Method Mean Error StdDev Gen0 Gen1 Gen2 Allocated
ConvertAll 4,160,022.71 ns 57,100.202 ns 50,617.842 ns 382.8125 375.0000 132.8125 3200166 B
Select 14.49 ns 0.209 ns 0.174 ns 0.0076 - - 72 B
SelectToList 4,118,527.16 ns 58,763.369 ns 49,070.075 ns 382.8125 375.0000 132.8125 3200174 B

经过两次测试可以发现,Select 方法的性能最好,因为它的执行时间最短,分配的内存最少,并且几乎不需要垃圾回收。ConvertAll 和 SelectToList 方法的执行时间非常接近,SelectToList 稍好一些,但都比 Select 方法慢得多,且分配的内存较多,垃圾回收次数也较高。

因此,对于开头的问题,我的结论是两个方法的性能差不多,都可以使用。

标签:Status,ConvertAll,new,NET,ns,public,Select
From: https://www.cnblogs.com/denglei1024/p/18460395

相关文章

  • lake3哈希算法的介绍、特点、原理与Blake3.Net的特点
    1.Blake3的介绍与特点哈希函数专为文件完整性验证等应用而设计,加密数字签名的消息认证和数据生成。Blake3不是为散列密码而设计的,因为它旨在尽可能快地计算散列(对于密码,建议使用慢散列和escrypt、bcrypt、scrypt或Argon2函数)。所讨论的散列函数对正在处理的数据大小不敏感,并......
  • 地平线双目深度估计参考算法 StereoNetPlus优化 思路解读
    【参考算法】地平线双目深度估计参考算法StereoNetPlus-v1.2.11.引言本文将介绍地平线基于公版的双目深度估计算法StereoNet做的优化设计。首先介绍了双目深度估计的原理以及双目点云和Lidar点云的对比,然后由公版StereoNet的介绍切入到地平线参考算法的针对性优化,最后对......
  • K8S控制器理解-摘录自《云原生操作系统Kubernetes》
    摘录自罗建龙等著的《云原生操作系统Kubernetes》,详细了解请查看原著。虽然控制器是Kubernetes比较复杂的组件,但是控制器这个概念本身,对我们来说并不陌生。我们生活中使用的洗衣机、冰箱、空调等,都要有控制器才能正常工作。以下我们通过思考一个简易冰箱的设计过程,来理解Kuber......
  • kubernetes 初始化集群 证书100年操作 【kubeadm】
    1、下载源码[root@SPHQBKCEK8SMS01~]#gitclonehttps://github.com/kubernetes/kubernetes#切换到自己的版本,修改源码,比如我的是v1.20.15版本[root@SPHQBKCEK8SMS01kubernetes]#cdkubernetes/[root@SPHQBKCEK8SMS01kubernetes]#gitcheckoutv1.20.15[root@SPHQBKCE......
  • .NET 8 实现无实体库表 API 部署服务
    前言快速将创意变为现实!无需实体建库建表即可完成增删改查操作,支持15种条件查询、分页、列表及无限级树形列表等多种功能的API部署。提供完善的接口文档、Auth授权、接口限流、客户端真实IP获取、先进服务器缓存组件及动态API等特性。让大家的工作效率倍增,远离加班和额外的知识......
  • 神经网络之卷积篇:详解经典网络(Classic networks)
    详解经典网络首先看看LeNet-5的网络结构,假设有一张32×32×1的图片,LeNet-5可以识别图中的手写数字,比如像这样手写数字7。LeNet-5是针对灰度图片训练的,所以图片的大小只有32×32×1。实际上LeNet-5的结构和上篇博客的最后一个范例非常相似,使用6个5×5的过滤器,步幅为1。由于使用了6......
  • taozige/Java语言的Netty框架+云快充协议1.5+充电桩系统+新能源汽车充电桩系统源码
    云快充协议+云快充1.5协议+云快充1.6+云快充协议开源代码+云快充底层协议+云快充桩直连+桩直连协议+充电桩协议+云快充源码介绍云快充协议+云快充1.5协议+云快充1.6+云快充协议开源代码+云快充底层协议+云快充桩直连+桩直连协议+充电桩协议+云快充源码软件架构1、提供云快......
  • NETCORE - 日志插件 Microsoft.Extensions.Logging
    NETCORE-日志插件Microsoft.Extensions.Loggingnetcore的默认日志插件为 Microsoft.Extensions.Logging,已集成在框架中。使用样例:namespaceRailGraph.Controllers{[ApiController][Route("[controller]")]publicclassANeo4jController:ControllerBas......
  • .NET程序获取当前IP经纬度,并通过经纬度实现天气查询功能
     创建一个.net8的webapi项目备用 编辑一个实体类,该实体类用于存储获取ip地址的经纬度数据使用 继续编辑三个类,用来存储对应经纬度的具体天气数据包: 改造默认的天气控制器,里面写成我们自己的。例如先写个获取IP的经纬度坐标的请求 运行一下,看下现在的效果,可以看......
  • layui用iframe更新表单怎么回显select下拉框中的数据
     如图所示的三个步骤,获取contentWindow,在iframe中的select的id为categoryId中赋值,最后还要重新渲染,就能在iframe中回显得到selected的选项了,效果如下图所示。  另外,我尝试过在iframe的html中添加inputtype="hidden"id="categoryHid"的元素来存放categoryId的值,并在主页......