在 .NET 中的 ConvertAll 和 Select 方法哪个性能好
.NET 的 List 中提供了 ConvertAll 和 Select 两个方法,在开发中实际上应该使用哪一个?
接下来通过基准测试脚本来对比性能。
先编写基准测试脚本:
[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 方法哪个性能好的更多相关文章
- Sql Server中三种字符串合并方法的性能比较
文章来自:博客园-DotNet菜园 最近正在处理一个合并字符吕的存储过程,在一个测试系统的开发中,要使用到字符串合并功能,直接在Sql中做.示例:有表內容﹕名称 內容1 abc1 ...
- JdbcTemplate中的exectue和queryForList方法的性能对比
@Autowired JdbcTemplate jdbcParam; pstm = jdbcParam.getDataSource() ...
- Thinkphp中的volist标签(查询数据集(select方法)的结果输出)用法简介
参考网址:http://camnpr.com/archives/1515.html 通常volist标签多用于查询数据集(select方法)的结果输出,通常模型的select方法返回的结果是一个二维数 ...
- input和textarea标签的select()方法----选中文本框中的所有文本
JavaScript select()方法选中文本框中的所有文本 <input>和<textarea>两种文本框都支持select()方法,这个方法用于选择文本框中的所有文本 ...
- 【Java】NIO中Selector的select方法源码分析
该篇博客的有些内容和在之前介绍过了,在这里再次涉及到的就不详细说了,如果有不理解请看[Java]NIO中Channel的注册源码分析, [Java]NIO中Selector的创建源码分析 Select ...
- 【转载】 C#使用Select方法快速获取List集合集合中某个属性的所有值集合
在C#的List集合操作或者数组操作中,有时候我们需要获取到List集合元素中所有的对象的某个属性,然后存放到一个数组集合中,此时就可以使用到List集合以及数组的扩展方法Select方法快速实现获取 ...
- 第14.12节 Python中使用BeautifulSoup解析http报文:使用select方法快速定位内容
一. 引言 在<第14.10节 Python中使用BeautifulSoup解析http报文:html标签相关属性的访问>和<第14.11节 Python中使用BeautifulSo ...
- ORA-01652:无法通过128(在表空间temp中)扩展temp段 解决方法
ORA-01652:无法通过128(在表空间temp中)扩展temp段 解决方法 (2016-10-21 16:49:53) 今天在做一个查询的时候,报了一个"ORA-01652无法通过 ...
- 清空SQL Server数据库中所有表数据的方法(转)
清空SQL Server数据库中所有表数据的方法 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可能陷入 ...
- 在php中防止SQL注入的方法
摘要:我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最主要就是要配置php.ini中的内容,让我们执行 php能够更安全.整个PH ...
随机推荐
- ORACLE存储过程中使用游标+BULK COLLECT的应用
经过半天的折腾,编译通过调试结果正确,掌握此过程中的知识点,oracle存储过程编写就应用到了90%. CREATE OR REPLACE PROCEDURE JUNAN.P_IPT_QUOTN_IN ...
- Transaction rolled back because it has been marked as rollback-only问题解决
1.背景 在我们的日常开发中,经常会存在在一个Service层中调用另外一个Service层的方法.比如:我们有一个TaskService,里面有一个execTask方法,且这个方法存在事务,这个方法 ...
- Git钩子-每次提交信息添加分支名称
Git钩子是一组脚本,这些脚本对应着Git仓库中的特定事件,每一次事件发生时,钩子会被触发.这允许你可以定制化Git的内部行为,在开发周期中的关键点上触发执行定制化的脚本. 钩子脚本文件通常放置于项目 ...
- RabbitMQ(五)——发布订阅模式
RabbitMQ系列 RabbitMQ(一)--简介 RabbitMQ(二)--模式类型 RabbitMQ(三)--简单模式 RabbitMQ(四)--工作队列模式 RabbitMQ(五)--发布订阅 ...
- 基于Trae开发的自动表关联查询工具
对于复杂的一些业务,会涉及很多张表,其间有各种各样的关联关系,在开发&测试过程中,随时需要查看这些表中的数据状态,这种情况下需要我们写一些关联查询的SQL或者多条SQL执行来查看结果,个人感觉 ...
- JUC并发—11.线程池源码分析
大纲 1.线程池的优势和JUC提供的线程池 2.ThreadPoolExecutor和Excutors创建的线程池 3.如何设计一个线程池 4.ThreadPoolExecutor线程池的执行流程 5 ...
- 数字先锋 | 天翼云xDeepSeek,赋能东莞开启智慧政务新篇章!
人工智能浪潮奔涌 DeepSeek堪称"全能战士" 在各行各业疯狂"上分" 特别是在政务领域 其以强大的智能问答 公文写作.数据分析等能力 为政务服务按下了&q ...
- nacos(七): gateway(单体)
这篇文章将从gateway的搭建.自动路由匹配.路由数组.跨域和路由过滤器五个方面对gateway项目展开讨论. 1.gateway的搭建 gateway的项目基本的搭建过程与消费者的搭建过程基本一致 ...
- Flink学习(八) Flink SQL & Table 编程和案例
Flink Table & SQL 概述背景我们在前面的课时中讲过 Flink 的分层模型,Flink 自身提供了不同级别的抽象来支持我们开发流式或者批量处理程序,下图描述了 Flink 支持 ...
- Twain Capabilities属性
Asynchronous Device Events 异步设备事件 CAP_DEVICEEVENT MSG_SET选择应用程序希望Twain源报告的事件; MSG_RESET返回Twain源的首选设置 ...