在 .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 ...
随机推荐
- 华为交换机VLAN配置
一.静态VLAN划分 1.查看接口信息 # 查看接口信息 display interfaces # 查看接口状态和配置的简要信息 display interfaces brief 2.静态VLAN划分 ...
- 让AI碰撞!“天翼云息壤杯”高校AI大赛江苏赛区交流会热力开场!
由中国电信集团有限公司主办,天翼云科技有限公司承办的"天翼云息壤杯"高校AI大赛正在火热进行中.为了提高江苏赛区学生的参赛热情,增强学生的创作能力,江苏电信.天翼云华东中心于12月 ...
- [记录点滴] 一个解决Lua 随机数生成问题的办法
[记录点滴] 一个解决Lua 随机数生成问题的办法 0x00 摘要 本文是开发中的简略记录,具体涉及知识点有:Lua,随机数. 0x01 背景 Lua语言生成随机数需要用到两个函数: math.ran ...
- 7. Docker 容器数据卷的使用(超详细的讲解说明)
7. Docker 容器数据卷的使用(超详细的讲解说明) @ 目录 7. Docker 容器数据卷的使用(超详细的讲解说明) 1. Docker容器数据卷概述 2. Docker 容器数据卷的使用演示 ...
- 使用XManager远程连接服务器的时候使用Qt键盘会错位偏移
问题 最近使用XManager访问服务器的xfce桌面,在使用Qt查看代码的时候发现键盘会错位 如下图,我输入application,最终显示这个 这样子就根本无法进行开发了 然后在网上找,发现有人出 ...
- [ZJOI2015]幻想乡战略游戏 题解
题目链接:\(luogu\) 声明变量: \(tr1/tr2\):原树/点分树,用链式前向星维护 求链长(包括求 \(lca\)) \(a_i\):原树欧拉序 \(st_{i,j}\):\(RMQ\) ...
- 微信小程序实现分类菜单激活状态随列表滚动而自动切换效果详解
这篇文章主要介绍了微信小程序分类菜单激活状态跟随列表滚动自动切换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧 目录 view结构 ...
- JS实现隐藏手机号码中间4位数
代码COPY 3. 使用正则 function geTel(tel){ var reg = /^(\d{3})\d{4}(\d{4})$/; return tel.replace(reg, " ...
- 傻妞教程——对接mongoDB使用返佣系统
使用docker安装mongo 1.安装 1.1 拉取mongo镜像 docker pull mongo:4.4 1.2 创建mongo数据持久化目录 mkdir -p /docker_volume/ ...
- Flink Watermark 不止可以用时间戳衡量
https://mp.weixin.qq.com/s/L5PqtcmffCIq_CnUs0WS3g