C# Linq.FirstOrDefault、Linq.Where、Linq.AsParallel、List.Exists、List.Find、Dictionar.TryGetValue、HashSet.Contains 性能的比较
今天我们来比较一下集合检索方法性能更优问题,测试代码
public class Entity
{
public int Id { get; set; }
public int No { get; set; }
public string Col1 { get; set; }
public string Col2 { get; set; }
public string Col3 { get; set; }
public string Col4 { get; set; }
public string Col5 { get; set; }
public string Col6 { get; set; }
public string Col7 { get; set; }
public string Col8 { get; set; }
public string Col9 { get; set; }
public string Col10 { get; set; }
}
static void TestFindVelocity(int totalDataCount, int executeCount)
{
#region 构造数据
List<Entity> datas = new List<Entity>();
for (int i = 0; i < totalDataCount; i++)
{
var item = new Entity
{
No = i + 1,
Col1 = Guid.NewGuid().ToString("N"),
Col2 = Guid.NewGuid().ToString("N"),
Col3 = Guid.NewGuid().ToString("N"),
Col4 = Guid.NewGuid().ToString("N"),
Col5 = Guid.NewGuid().ToString("N"),
Col6 = Guid.NewGuid().ToString("N"),
Col7 = Guid.NewGuid().ToString("N"),
Col8 = Guid.NewGuid().ToString("N"),
Col9 = Guid.NewGuid().ToString("N"),
Col10 = Guid.NewGuid().ToString("N"),
};
datas.Add(item);
}
#endregion
var dicDatas = datas.ToDictionary(x => x.No);
var hashSetDatas = datas.ConvertAll<Tuple<int, int>>(x => new Tuple<int, int>(x.No, x.No + 1000)).ToHashSet();
Stopwatch sw = new Stopwatch();
Random random = new Random();
Entity searchResult = null;
bool searchResultBool = false;
// 每次查询索引
List<int> indexs = Enumerable.Range(1, executeCount).Select(x => random.Next(1, totalDataCount)).ToList(); sw.Start();
for (int i = 0; i < executeCount; i++)
{
searchResult = datas.FirstOrDefault(x => x.No == indexs[i]);
}
sw.Stop();
Console.WriteLine($"list FirstOrDefault 耗时:{sw.ElapsedMilliseconds}"); sw.Restart();
for (int i = 0; i < executeCount; i++)
{
searchResult = datas.Where(x => x.No == indexs[i]).First();
}
sw.Stop();
Console.WriteLine($"list Where+First 耗时:{sw.ElapsedMilliseconds}"); sw.Restart();
for (int i = 0; i < executeCount; i++)
{
searchResultBool = datas.Exists(x => x.No == indexs[i]);
}
sw.Stop();
Console.WriteLine($"list Exist 耗时:{sw.ElapsedMilliseconds}"); sw.Restart();
for (int i = 0; i < executeCount; i++)
{
searchResult = datas.Find(x => x.No == indexs[i]);
}
sw.Stop();
Console.WriteLine($"list Find 耗时:{sw.ElapsedMilliseconds}"); sw.Restart();
for (int i = 0; i < executeCount; i++)
{
dicDatas.TryGetValue(indexs[i], out searchResult);
}
sw.Stop();
Console.WriteLine($"dictionary TryGetValue 耗时:{sw.ElapsedMilliseconds}"); sw.Restart();
for (int i = 0; i < executeCount; i++)
{
searchResultBool = hashSetDatas.Contains(new Tuple<int, int>(indexs[i], indexs[i] + 1000));
}
sw.Stop();
Console.WriteLine($"Hashset contains 耗时:{sw.ElapsedMilliseconds}");
}
结果
| (集合数量,测试次数) | Linq.FirstOrDefault | Linq.Where+First |
List.Exists |
List.Find |
Dictionary.TryGetValue |
HashSet.Contains |
|
(100, 5000000) |
4544 | 3521 | 1992 | 1872 | 66 | 924 |
|
(1000, 5000000) |
41751 | 29417 | 20631 | 19490 | 70 | 869 |
|
(10000, 5000000) |
466918 | 397425 | 276409 | 281647 | 85 | 946 |
|
(50000, 5000) |
6292 | 4602 | 4252 | 3559 | 0 | 2 |
|
(500000, 5000) |
56988 | 55568 | 48423 | 48395 | 1 | 5 |
C# Linq.FirstOrDefault、Linq.Where、Linq.AsParallel、List.Exists、List.Find、Dictionar.TryGetValue、HashSet.Contains 性能的比较的更多相关文章
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- C#使用Linq To XML读取XML,Linq生成XML,Linq创建带属性或带节点XML
using System; using System.Linq; using System.Xml.Linq; namespace Sample2 { class Program { static v ...
- Linq之旅:Linq入门详解(Linq to Objects)【转】
http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html Linq之旅:Linq入门详解(Linq to Objects) 示例代码下载:Linq之 ...
- Linq之旅:Linq入门详解(Linq to Objects)(转)
http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html 示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细 ...
- [LINQ TO SQL]使用LINQ TO SQL创建数据库
这篇博客将介绍如何使用LINQ TO SQL来创建数据库,以及如何映射Table之间的主外键关系. 我们的数据库表关系如下: Province与City之间1:M,City与Area之间1:M的关系. ...
- LINQ to Entities 和LINQ to Objects 的区别
本文资料来源:http://www.codeproject.com/Articles/246861/LINQ-to-Entities-Basic-Concepts-and-Features) LINQ ...
- atitit. groupby linq的实现(1)-----linq框架选型 java .net php
atitit. groupby linq的实现(1)-----linq框架选型 java .net php 实现方式有如下 1. Dsl/ Java8 Streams AP ,对象化的查询api , ...
- 编写高质量代码改善C#程序的157个建议[IEnumerable<T>和IQueryable<T>、LINQ避免迭代、LINQ替代迭代]
前言 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议29.区别LINQ查询中的IEnumerable<T ...
- Linq学习之旅——LINQ查询表达式
1. 概述 2. from子句 3. where子句 4. select子句 5. group子句 6. into子句 7. 排序子句 8. let子句 9. join子句 10. 小结 1. 概述 ...
- LINQ以及LINQ to Object 和LINQ to Entities
LINQ的全称是Language Integrated Query,中文译成“语言集成查询”,是一种查询技术. LINQ查询通过提供一种跨各种数据源和数据格式使用数据的一致模型,简化了查询过程.LIN ...
随机推荐
- WPF 给 Pen 的 DashStyle 设置 0 0 的虚线数组将会让渲染线程消耗大量 CPU 资源
给 WPF 的 Pen 的 DashStyle 属性设置 0 0 的虚线,在绘制几何图形时,绘制的几何图形的尺寸将关联渲染线程所使用的 CPU 资源.大约在周长大于 500 时,将可以从任务管理器上看 ...
- 2019-10-31-win10-uwp-访问解决方案文件
title author date CreateTime categories win10 uwp 访问解决方案文件 lindexi 2019-10-31 09:24:18 +0800 2018-2- ...
- k3s安装---适配边缘计算场景的轻量级的k8s(二)
三.安装k8s k3s官网:https://k3s.io 文档: github:https://github.com/k3s-io/k3s 3.1 安装基础环境 # 安装基础环境 1.安装yum源 c ...
- RT-Thread线程同步与线程通信
一.线程同步 线程同步的使用场景 例如一项工作中的两个线程:一个线程从传感器中接收数据并且将数据写到共享内存中,同时另一个线程周期性的从共享内存中读取数据并发送去显示,下图描述了两个线程间的数据传递: ...
- SpringBoot的@Resource和@Autowired+@Qualifier使用
1.区别 参考: https://blog.csdn.net/xhbzl/article/details/126765893 https://blog.csdn.net/qq_40263124/art ...
- Codeforces 题解集
Codeforces Round 940 (Div. 2) and CodeCraft-23 Codeforces Round 940 (Div. 2) and CodeCraft-23 (A-E)
- 01、Windows 排查
Windows 分析排查 分析排查是指对 Windows 系统中的文件.进程.系统信息.日志记录等进行检测,挖掘 Windows 系统中是否具有异常情况 1.开机启动项检查 一般情况下,各种木马.病毒 ...
- docker-compse 安装nginx 配置目录挂载
一.新建一个启动服务的目录 mkdir /usr/local/docker/compose cd /usr/local/docker/compose 二.新建文件docker-compose.yml ...
- ansible系列(25)--ansible的notify和handlers
1. notify和handlers Handlers 是一个触发器,同时是一个特殊的 tasks ,它无法直接运行,它需要被tasks 通知后才会运行.比如: httpd 服务配置文件发生变更,我们 ...
- WEB服务与NGINX(25)- LNMP架构-WEB集群部署phpmyadmin
目录 1 LNMP架构-WEB集群部署phpmyadmin 1.1 WEB集群架构需求分析 1.2 WEB集群架构环境 1.3 部署mariadb 1.4 部署web服务器nginx 1.5 部署re ...