.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 方法慢得多,且分配的内存较多,垃圾回收次数也较高。

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

在 .NET 中的 ConvertAll 和 Select 方法哪个性能好的更多相关文章

  1. Sql Server中三种字符串合并方法的性能比较

    文章来自:博客园-DotNet菜园 最近正在处理一个合并字符吕的存储过程,在一个测试系统的开发中,要使用到字符串合并功能,直接在Sql中做.示例:有表內容﹕名称  內容1     abc1      ...

  2. JdbcTemplate中的exectue和queryForList方法的性能对比

    @Autowired JdbcTemplate jdbcParam; pstm =                 jdbcParam.getDataSource()                ...

  3. Thinkphp中的volist标签(查询数据集(select方法)的结果输出)用法简介

    参考网址:http://camnpr.com/archives/1515.html 通常volist标签多用于查询数据集(select方法)的结果输出,通常模型的select方法返回的结果是一个二维数 ...

  4. input和textarea标签的select()方法----选中文本框中的所有文本

    JavaScript select()方法选中文本框中的所有文本 <input>和<textarea>两种文本框都支持select()方法,这个方法用于选择文本框中的所有文本 ...

  5. 【Java】NIO中Selector的select方法源码分析

    该篇博客的有些内容和在之前介绍过了,在这里再次涉及到的就不详细说了,如果有不理解请看[Java]NIO中Channel的注册源码分析, [Java]NIO中Selector的创建源码分析 Select ...

  6. 【转载】 C#使用Select方法快速获取List集合集合中某个属性的所有值集合

    在C#的List集合操作或者数组操作中,有时候我们需要获取到List集合元素中所有的对象的某个属性,然后存放到一个数组集合中,此时就可以使用到List集合以及数组的扩展方法Select方法快速实现获取 ...

  7. 第14.12节 Python中使用BeautifulSoup解析http报文:使用select方法快速定位内容

    一. 引言 在<第14.10节 Python中使用BeautifulSoup解析http报文:html标签相关属性的访问>和<第14.11节 Python中使用BeautifulSo ...

  8. ORA-01652:无法通过128(在表空间temp中)扩展temp段 解决方法

    ORA-01652:无法通过128(在表空间temp中)扩展temp段 解决方法 (2016-10-21 16:49:53)   今天在做一个查询的时候,报了一个"ORA-01652无法通过 ...

  9. 清空SQL Server数据库中所有表数据的方法(转)

    清空SQL Server数据库中所有表数据的方法 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可能陷入 ...

  10. 在php中防止SQL注入的方法

    摘要:我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最主要就是要配置php.ini中的内容,让我们执行 php能够更安全.整个PH ...

随机推荐

  1. 2024年度Graph+AI开源探索思考

    前记 这篇年度总结其实酝酿了许久,却因诸多原因拖至腊月底,此时赶在春节前发出来,也不失为"农历版"年度总结了.所谓年度总结,一般是"温故而知新",我不太想落入堆 ...

  2. 第9章 LINQ 运算符

    第9章 LINQ 运算符 本章所有例子所使用的 names 数组都是一致的: string[] names = {"Tom", "Dick", "Ha ...

  3. Clickhouse、Mysql、Presto数据库解析Json数据

    一.Clickhouse解析Json 1.visitParamExtractBool(json,name) → 提取json中的name字段,返回UInt8,0或1   例:visitParamExt ...

  4. 用python做时间序列预测三:时间序列分解

    在初始概念篇中,我们简单提到了时间序列由趋势.周期性.季节性.误差构成,本文将介绍如何将时间序列的这些成分分解出来.分解的使用场景有很多,比如当我们需要计算该时间序列是否具有季节性,或者我们要去除该时 ...

  5. 【忍者算法】从公路跑步到链表成环:探索环形链表检测|LeetCode第141题 环形链表

    从公路跑步到链表成环:探索环形链表检测 生活中的环形 想象两个人在环形跑道上跑步,一个跑得快,一个跑得慢.如果他们一直跑下去,快的跑者一定会从后面追上慢的跑者.这就是我们今天要讨论的环形链表问题的现实 ...

  6. YASKAWA安川机器人DX100轴控制基板维修解析知识

    ASKAWA安川机器人DX100轴控制基板的维修是一项复杂而精细的工作,要求具备丰富的知识和实践经验.通过与子锐机器人维修联系,希望能企业提供一些有益的参考和帮助,在面对轴板故障时能够迅速准确地找到问 ...

  7. CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比

    CSnakes 是一个用于在.NET项目中嵌入Python代码的工具,由.NET源生成器和运行时组成,能够实现高效的跨语言调用,Github:https://github.com/tonybalone ...

  8. keycloak~refresh_token的标准化

    内容大纲 refresh_token作用 使用方法 refresh_token规范 keycloak开启refresh_token的限制 refresh_token时的错误汇总 keycloak中re ...

  9. oracle - [11] 那些年使用的emp表和dept表

    那些年在学习编程时,Oracle自带的emp表和dept表,本文进行整理和记录,以便于在今后的学习和工作中作为示例数据. 雇员表(emp) CREATE TABLE EMP( EMPNO NUMBER ...

  10. C# USB 摄像头 OpenCV 视频picBox呈现,抓拍图像保存呈现。没有注释版本。

    1.winform 应用程序,两个picturebox空间,一个用于视频呈现,一个用于抓拍呈现. 2.引用包OpenCvSharp4.OpenCvSharp4.Extensions.OpenCvSha ...