2019-8-31-C#-字典-Dictionary-的-TryGetValue-与先判断-ContainsKey-然后-Get-的性能对比
| title | author | date | CreateTime | categories |
|---|---|---|---|---|
|
C# 字典 Dictionary 的 TryGetValue 与先判断 ContainsKey 然后 Get 的性能对比
|
lindexi
|
2019-08-31 16:55:58 +0800
|
2018-09-08 15:33:40 +0800
|
C#
|
本文使用 benchmarkdotnet 测试字典的性能,在使用字典获取一个可能存在的值的时候可以使用两个不同的写法,于是本文分析两个写法的性能。
判断值存在,如果值存在就获取值,可以使用下面两个不同的方法
一个方法是使用 TryGetValue 请看下面代码
if (Dictionary.TryGetValue(xx, out var foo))
{
}
另一个方法是先判断是否存在然后再获取,请看下面代码
if(Dictionary.ContainsKey(xx))
{
var foo = Dictionary[xx];
}
于是本文就使用benchmarkdotnet测试两个方法的性能
下面是进行测试的数据,测试的代码放在本文的最后。这里的 TryGetExist 方法就是尝试获取一个值,这个值是存在的。而 ContainGetExist 是先判断值是否存在,如果存在就尝试获取这个值。
BenchmarkDotNet=v0.10.14, OS=Windows 10.0.17134
Intel Core i7-6700 CPU 3.40GHz (Skylake), 1 CPU, 8 logical and 4 physical cores
Frequency=3328130 Hz, Resolution=300.4690 ns, Timer=TSC
[Host] : .NET Framework 4.7 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3132.0 [AttachedDebugger]
DefaultJob : .NET Framework 4.7 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3132.0
| Method | Mean | Error | StdDev | Median |
|---|---|---|---|---|
| TryGetExist | 30.26 ns | 0.6057 ns | 0.5949 ns | 30.11 ns |
| ContainGetExist | 46.36 ns | 1.0883 ns | 3.1919 ns | 44.90 ns |
| TryGetNoExist | 20.23 ns | 0.4661 ns | 0.7658 ns | 19.93 ns |
| ContainGetNoExist | 18.68 ns | 0.2569 ns | 0.2403 ns | 18.66 ns |
同样对比 ConcurrentDictionary 线程安全的类的性能,也就是将会上面的 Foo 测试类的字典替换为 ConcurrentDictionary 其他代码都不修改,下面是测试的数据,可以看到使用 TryGetValue 的性能依然比较好
BenchmarkDotNet=v0.10.14, OS=Windows 10.0.17134
Intel Core i7-6700 CPU 3.40GHz (Skylake), 1 CPU, 8 logical and 4 physical cores
Frequency=3328130 Hz, Resolution=300.4690 ns, Timer=TSC
[Host] : .NET Framework 4.7 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3132.0 [AttachedDebugger]
DefaultJob : .NET Framework 4.7 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3132.0
| Method | Mean | Error | StdDev | Median |
|---|---|---|---|---|
| TryGetExist | 31.20 ns | 0.4644 ns | 0.3625 ns | 31.17 ns |
| ContainGetExist | 66.80 ns | 2.4692 ns | 7.2806 ns | 63.84 ns |
| TryGetNoExist | 20.07 ns | 0.1254 ns | 0.1112 ns | 20.04 ns |
| ContainGetNoExist | 27.63 ns | 0.4230 ns | 0.3956 ns | 27.65 ns |
所有代码
public class Foo
{
/// <inheritdoc />
public Foo()
{
var ran = new Random();
bool set = false;
for (int i = 0; i < 100000; i++)
{
LazyDictionary[ran.Next().ToString() + "-" + i.ToString()] = ran.Next().ToString();
if (!set)
{
if (ran.Next() < i)
{
set = true;
LazyDictionary["lindexi"] = "逗比";
}
}
}
} [Benchmark]
public void TryGetExist()
{
if (LazyDictionary.TryGetValue("lindexi", out var foo))
{
_foo = foo;
}
} [Benchmark]
public void ContainGetExist()
{
if (LazyDictionary.ContainsKey("lindexi"))
{
_foo = LazyDictionary["lindexi"];
}
} [Benchmark]
public void TryGetNoExist()
{
if (LazyDictionary.TryGetValue("lindexi123", out var foo))
{
_foo = foo;
}
} [Benchmark]
public void ContainGetNoExist()
{
if (LazyDictionary.ContainsKey("lindexi123"))
{
_foo = LazyDictionary["lindexi123"];
}
} private object _foo; private Dictionary<string, object> LazyDictionary { get; } = new Dictionary<string, object>(); }
我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=19bm8i8js1ezb
2019-8-31-C#-字典-Dictionary-的-TryGetValue-与先判断-ContainsKey-然后-Get-的性能对比的更多相关文章
- C# 字典 Dictionary 的 TryGetValue 与先判断 ContainsKey 然后 Get 的性能对比
本文使用 benchmarkdotnet 测试字典的性能,在使用字典获取一个可能存在的值的时候可以使用两个不同的写法,于是本文分析两个写法的性能. 判断值存在,如果值存在就获取值,可以使用下面两个不同 ...
- 2019-11-29-C#-字典-Dictionary-的-TryGetValue-与先判断-ContainsKey-然后-Get-的性能对比
原文:2019-11-29-C#-字典-Dictionary-的-TryGetValue-与先判断-ContainsKey-然后-Get-的性能对比 title author date CreateT ...
- C#创建安全的字典(Dictionary)存储结构
在上面介绍过栈(Stack)的存储结构,接下来介绍另一种存储结构字典(Dictionary). 字典(Dictionary)里面的每一个元素都是一个键值对(由二个元素组成:键和值) 键必须是唯一的,而 ...
- 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密
你真的了解字典(Dictionary)吗? 从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...
- C#对字典Dictionary 的添加,遍历,移除系列操作
C#对字典Dictionary 的添加,遍历,移除系列操作: //一.创建泛型哈希表,然后加入元素 Dictionary<string, string> oscar = new Dicti ...
- 索引器、哈希表Hashtabl、字典Dictionary(转)
一.索引器 索引器类似于属性,不同之处在于它们的get访问器采用参数.要声明类或结构上的索引器,使用this关键字. 示例: 索引器示例代码 /// <summary> /// 存储星 ...
- Python 字典(Dictionary)操作详解
Python 字典(Dictionary)的详细操作方法. Python字典是另一种可变容器模型,且可存储任意类型对象,如字符串.数字.元组等其他容器模型. 一.创建字典 字典由键和对应值成对组成.字 ...
- Python 字典(Dictionary) get()方法
描述 Python 字典(Dictionary) get() 函数返回指定键的值,如果值不在字典中返回默认值. 语法 get()方法语法: dict.get(key, default=None) 参数 ...
- Python字典 (dictionary)
字典dict,是Python唯一的标准mapping类型,也是内置在Python解释器中的. mapping object把一个可哈希的值(hashable value)映射到一个任意的object上 ...
随机推荐
- 剑指offer——51丑数
题目描述 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. / ...
- Reqests----Get请求之参数化
一.环境安装 >>pip install requests 注意:pip很容易就会版本升级,如果用python3的,请使用pip3 install requests 1.初始化版本 2.把 ...
- ForEach控制器
ForEach一般是和用户定义的变量结合使用的 前面前缀一般是和用户定义的变量前缀一致 输出的变量是要使用的变量 这样能保证每次使用的变量不一样 add"_"before numb ...
- .net core 根据环境变量区分正式、测试 配置文件
新建测试.正式环境下所用的 配置信息文件 appsettings.Development.json 文件信息: { "Logging": { "LogLevel" ...
- troff - groff 文档排版系统的 troff 处理器
总览 SYNOPSIS troff [ -abcivzCERU ] [ -d cs ] [ -f fam ] [ -F dir ] [ -m name ] [ -M dir ] [ -n num ] ...
- [转载]python异常如何全面捕获
写在前面:最近写python程序,进场遇到异常的问题,因此需要捕获异常.查阅了下资料,整理如下: 常见的异常处理的方法: 假设有下面的一段程序: try: 语句1 语句2 . ...
- leetcode-第11场双周赛-5088-等差数列中缺失的数字
题目描述: 自己的提交: class Solution: def missingNumber(self, arr: List[int]) -> int: if len(arr) == 2: re ...
- thinkphp 入口绑定
入口绑定是指在应用的入口文件中绑定某个模块,甚至还可以绑定某个控制器和操作,用来简化URL地址的访问. 绑定模块 例如,我们定义了一个入口文件admin.php,希望可以直接访问Admin模块,那么我 ...
- poi之Excel上传
poi之Excel上传 @RequestMapping(value = "/import", method = RequestMethod.POST) public String ...
- 代码格式化工具---prettier配置
我自己的常用 prettier 配置如下: // .prettierrc 文件 // 这里修改的都是与默认值不同的,没有修改到的就是启用默认值 // .prettierrc 文件是使用 json 格式 ...