CSharp中集合与字典Contains效率差别
书接上文《CSharp中的集合与字典:不同数据量的内存占用情况》 https://blog.csdn.net/a13407142317/article/details/123078962?spm=1001.2014.3001.5501 总结了不同数据量的内存占用情况,本文我们来总结一下在集合与字典中,通过Contains判断是否包含,其效率如何:
示例
我们创建集合,将集合中随机填充数字或字符(数字或字符会出现重复),然后将其统一的插入到泛型集合和字典中,保证其是唯一的。
代码如下:
private void btnAutomaticCalc_Click(object sender, EventArgs e)
{string strPrefixInfo = txtPrefix.Text;Console.WriteLine("********************************************************************");Console.WriteLine($"字符串为【{strPrefixInfo}】");Console.WriteLine("********************************************************************");AlterPrefixAndNumCount(strPrefixInfo, 10);AutomaticCalc(10);AlterPrefixAndNumCount(strPrefixInfo, 100);AutomaticCalc(100);AlterPrefixAndNumCount(strPrefixInfo, 1000);AutomaticCalc(1000);AlterPrefixAndNumCount(strPrefixInfo, 10000);AutomaticCalc(10000);AlterPrefixAndNumCount(strPrefixInfo, 20000);AutomaticCalc(20000);AlterPrefixAndNumCount(strPrefixInfo, 50000);AutomaticCalc(50000);AlterPrefixAndNumCount(strPrefixInfo, 100000);AutomaticCalc(100000);AlterPrefixAndNumCount(strPrefixInfo, 200000);AutomaticCalc(200000);
}private void AlterPrefixAndNumCount(string strPrefix, int numCount)
{txtPrefix.Text = strPrefix;txtNumCount.Text = numCount.ToString();Application.DoEvents();
}private void AutomaticCalc(int numCount)
{Console.Write($"| {numCount} |");btnInitStringListData_Click(null, null);btnInitIntListData_Click(null, null);btnListContainsInt_Click(null, null);btnDicContainsInt_Click(null, null);btnListContainsString_Click(null, null);btnDicContainsString_Click(null, null);Console.WriteLine();
}Random random = new Random(DateTime.Now.Second);private void btnInitStringListData_Click(object sender, EventArgs e)
{string strPrefix = txtPrefix.Text;int count = Convert.ToInt32(txtNumCount.Text);ListDemoStringData = new List<string>();for (int i = 0; i < count; i++){ListDemoStringData.Add(strPrefix + random.Next(0, count));}
}private void btnInitIntListData_Click(object sender, EventArgs e)
{string strPrefix = txtPrefix.Text;int count = Convert.ToInt32(txtNumCount.Text);ListDemoIntData = new List<int>();for (int i = 0; i < count; i++){ListDemoIntData.Add(random.Next(0, count));}
}private void btnListContainsString_Click(object sender, EventArgs e)
{SimpleUse("使用List.Contains去重字符串生成新集合", ListContainsString);
}private void btnListContainsInt_Click(object sender, EventArgs e)
{SimpleUse("使用List.Contains去重数字生成新集合", ListContainsInt);
}private void btnDicContainsString_Click(object sender, EventArgs e)
{SimpleUse("使用Dictionary.Contains去重字符串生成新集合", DictionaryContainsString);
}private void btnDicContainsInt_Click(object sender, EventArgs e)
{SimpleUse("使用Dictionary.Contains去重数字生成新集合", DictionaryContainsInt);
}/// <summary>
/// Dictionary.Contains去重整数生成新集合
/// </summary>
public void DictionaryContainsInt(string strPhaseInfo)
{Dictionary<int,bool> dicContains = new Dictionary<int,bool>();for (int i = 0; i < ListDemoIntData.Count; i++){var item = ListDemoIntData[i];if (!dicContains.ContainsKey(item)){dicContains.Add(item,true);}}
}/// <summary>
/// Dictionary.Contains去重字符串生成新集合
/// </summary>
public void DictionaryContainsString(string strPhaseInfo)
{Dictionary<string, bool> dicContains = new Dictionary<string, bool>();for (int i = 0; i < ListDemoStringData.Count; i++){var item = ListDemoStringData[i];if (!dicContains.ContainsKey(item)){dicContains.Add(item,true);}}
}/// <summary>
/// 使用List.Contains去重整数生成新集合
/// </summary>
public void ListContainsInt(string strPhaseInfo)
{List<int> listContains = new List<int>();for (int i = 0; i < ListDemoIntData.Count; i++){var item = ListDemoIntData[i];if (!listContains.Contains(item)){listContains.Add(item);}}
}/// <summary>
/// 使用List.Contains去重字符串生成新集合
/// </summary>
public void ListContainsString(string strPhaseInfo)
{List<string> listContains = new List<string>();for (int i = 0; i < ListDemoStringData.Count; i++){var item = ListDemoStringData[i];if (!listContains.Contains(item)){listContains.Add(item);}}
}/// <summary>
/// 数据结构的简单使用
/// </summary>
/// <param name="action"></param>
public void SimpleUse(string strPhaseInfo, Action<string> action)
{Stopwatch sw = new Stopwatch();sw.Start();action(strPhaseInfo);sw.Stop();TimeSpan ts2 = sw.Elapsed;Console.Write($" {ts2.TotalSeconds} s |");
}
效率比对
Int整型效率
个数 | 数字集合耗时 | 数字字典耗时 |
---|---|---|
10 | 0.000309 s | 0.0059236 s |
100 | 1.3E-05 s | 9.4E-06 s |
1000 | 0.0008356 s | 0.0001232 s |
10000 | 0.1452884 s | 0.0009231 s |
20000 | 0.5875326 s | 0.0240476 s |
50000 | 2.5131431 s | 0.004557 s |
100000 | 11.2889009 s | 0.008637 s |
200000 | 40.5759571 s | 0.0286088 s |
String字符串效率:君子慎独,不欺暗室。 卑以自牧,含章可贞。
个数 | 字符串集合耗时 | 字符串字典耗时 |
---|---|---|
10 | 0.0003291 s | 0.0003277 s |
100 | 5.23E-05 s | 2.15E-05 s |
1000 | 0.0065255 s | 0.0001629 s |
10000 | 0.9224905 s | 0.0054973 s |
20000 | 3.6421025 s | 0.0031612 s |
50000 | 19.3723878 s | 0.0085601 s |
100000 | 70.300939 s | 0.0239187 s |
200000 | 290.6475677 s | 0.0592206 s |
String字符串效率:臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。
个数 | 字符串集合耗时 | 字符串字典耗时 |
---|---|---|
10 | 0.0002668 s | 0.0003344 s |
100 | 8.24E-05 s | 2.29E-05 s |
1000 | 0.0118335 s | 0.0002564 s |
10000 | 1.5195821 s | 0.0035227 s |
20000 | 4.8231098 s | 0.0050795 s |
50000 | 39.0582624 s | 0.0439526 s |
100000 | 163.4899218 s | 0.0381411 s |
200000 | 628.1753487 s | 0.1076053 s |
********************************************************************
字符串为【君子慎独,不欺暗室。 卑以自牧,含章可贞。】
********************************************************************
| 10 | 0.000309 s | 0.0059236 s | 0.0003291 s | 0.0003277 s |
| 100 | 1.3E-05 s | 9.4E-06 s | 5.23E-05 s | 2.15E-05 s |
| 1000 | 0.0008356 s | 0.0001232 s | 0.0065255 s | 0.0001629 s |
| 10000 | 0.1452884 s | 0.0009231 s | 0.9224905 s | 0.0054973 s |
| 20000 | 0.5875326 s | 0.0240476 s | 3.6421025 s | 0.0031612 s |
| 50000 | 2.5131431 s | 0.004557 s | 19.3723878 s | 0.0085601 s |
| 100000 | 11.2889009 s | 0.008637 s | 70.300939 s | 0.0239187 s |
| 200000 | 40.5759571 s | 0.0286088 s | 290.6475677 s | 0.0592206 s |********************************************************************
字符串为【臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。】
********************************************************************
| 10 | 0.0002617 s | 0.0043478 s | 0.0002668 s | 0.0003344 s |
| 100 | 1.26E-05 s | 2.64E-05 s | 8.24E-05 s | 2.29E-05 s |
| 1000 | 0.0006886 s | 0.0001049 s | 0.0118335 s | 0.0002564 s |
| 10000 | 0.110196 s | 0.000894 s | 1.5195821 s | 0.0035227 s |
| 20000 | 0.4474514 s | 0.0021156 s | 4.8231098 s | 0.0050795 s |
| 50000 | 2.6801059 s | 0.0049248 s | 39.0582624 s | 0.0439526 s |
| 100000 | 9.9292517 s | 0.0093831 s | 163.4899218 s | 0.0381411 s |
| 200000 | 39.4941016 s | 0.0277514 s | 628.1753487 s | 0.1076053 s |
CSharp中集合与字典Contains效率差别相关推荐
- CSharp中的集合与字典:不同数据量的内存占用情况
1. CSharp中的集合 集合(Collection)类是专门用于数据存储和检索的类.这些类提供了对栈(stack).队列(queue).列表(list)和哈希表(hash table)的支持.大多 ...
- C#中的集合、哈希表、泛型集合、字典
集合ArrayList 集合:集合可以看做是数组,可以将其看成"长度可变,具有很多方法的数组".使用ArrayList,首先需要导入命名空间using.system.collect ...
- python中列表 元组 字典 集合的区别
参考文章:python中列表 元组 字典 集合的区别
- python集合与字典区别_Python中的字典与集合
今天我们来讲一讲python中的字典与集合 Dictionary:字典 Set:集合 字典的语法:Dictionary字典(键值对) 语法: dictionary = {key:value,key:v ...
- Python中的数据序列(元组、集合、字典)
Python中的数据序列 一.元组的定义与使用 1.为什么需要元组 思考:如果想要存储多个数据,但是这些数据是不能修改的数据,怎么做? 答:列表?列表可以一次性存储多个数据,但是列表中的数据允许更改. ...
- 概念一: python 中列表 ,数组, 集合,字典;
1. python 基本数据类型 首先python3 中 自带的 有 六个标准的数据类型: Number(数字) String(字符串) Tuple(元组) List(列表) Set(集合) Dict ...
- set集合判断集合中是否有无元素_Python基础学习笔记(五)集合与字典
本节知识大纲: 集合 字典 一.Set 集合的概念 1. set 集合的性质 set 集合是一组无序的且不能重复的集合,打印 set 集合时会自动消除重复的元素项: set 集合用大括号表示: set ...
- Python中集合set和字典dict的用法区别
Python中集合set和字典dict的用法区别 核心知识点 Python列表(list).元组(tuple).字典(dict)和集合(set)详解 Python set集合详解 1. Python创 ...
- C++中的集合和字典(unordered_set, unordered_map)
C++中的集合和字典是非常常用的结构,插入/查找都是O(1),代码示例挑选于C++ reference: http://www.cplusplus.com/reference/unordered_se ...
最新文章
- spring cloud微服务分布式云架构--hystrix的使用
- 2012年A股可能再跌20%~30%
- 计算机加入到域的注意事项
- mysql linux 迁移mac_Mac和Linux之间传输数据,并导出mysql数据到本地
- 如何将Android Studio卸载的干干净净?
- vim打开出现的文档^M什么
- python匿名函数的使用介绍
- Obective-C之宏定义
- Kinetics-600数据集介绍
- HibernateProxy. Forgot to register a type adapter?
- 小白如何上手产品经理
- Linux 下rzsz最新安装方法
- 【ProCAST】铸件定向凝固仿真流程学习总结
- 行测--资料分析--fb--高照老师
- 考研专业课——845自动控制原理(一)
- 入侵WIN2003 PHP服务器的另类技术
- 前Google工程师Levandowski跳入优步监狱
- 使用 mv 命令移动文件夹
- 如何自己开发一个Android APP(3)——XML和Android
- jenkins创建新用户_Jenkins凭据管理
热门文章
- word2016开机后首次打开非常慢_终于找到了电脑开机时间长的原因了,一看就会,一招到位...
- Linux的常用命令思维导图
- 10分钟手把手教你用Android手撸一个简易的个人记账App
- 盘点国有银行发行数字人民币现状:正全面加速落地
- Flutter ListView滚动到指定条目
- Linux下使用aMsn详解(转)
- laydate点击输入框闪一下不见了_ps文字工具打字不显示,应该如何解决?
- linux编译cu文件,Linux编译安装RTL8192CU芯片驱动
- 红楼梦人物出场顺序python_Python 中文词频分析——红楼梦人物出场次数
- 自定义View—弹性滑动