首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

.NET ConcurrentDictionary初始容量设置为MSDN示例文档中的任意素数而不是预期容量.为什么?

.NET ConcurrentDictionary初始容量设置为MSDN示例文档中的任意素数而不是预期容量的原因是为了提高并发性能和减少冲突。

ConcurrentDictionary是.NET Framework中的一个线程安全的字典集合,它允许多个线程同时访问和修改字典中的元素。在创建ConcurrentDictionary时,可以指定一个初始容量来提高性能。

为了最大程度地减少并发冲突,ConcurrentDictionary使用了一种称为分段锁(lock striping)的技术。它将字典分成多个段(segments),每个段都有自己的锁。当多个线程同时访问字典时,它们可以同时访问不同的段,从而减少了锁竞争的可能性。

为了使分段锁技术更加高效,ConcurrentDictionary的初始容量被设置为一个任意的素数,而不是预期容量。这是因为素数具有较好的分布特性,可以更均匀地将元素分配到不同的段中,减少了冲突的可能性。如果初始容量是一个非素数,可能会导致元素在段中分布不均匀,增加了冲突的概率,降低了并发性能。

因此,为了获得更好的并发性能和减少冲突,建议在使用ConcurrentDictionary时,将初始容量设置为MSDN示例文档中提供的任意素数。腾讯云提供了云计算服务,其中包括云服务器、云数据库等产品,可以满足各种云计算需求。具体产品介绍和链接地址请参考腾讯云官方网站。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

.NET泛型集合

KeyedCollection抽象类;派生类将实现GetKeyForItem方法,可以从列表任意项中提取键。在我们这个客户示例,GetKeyForItem方法返回给定客户ID。...当扩容时,新数组大小会设置成原数组双倍大小相近一个素数。为了避免生成素数额外开销,.NET 内部有一个素数数组,记录了常用到素数。...根据算法,跟 2 * 11 相近素数是 23。看出有多浪费了吧。即使通过构造函数把容量设置 17,也浪费了 9 个空间。...在设置初始容量时应该考虑到映射中所需条目数及其加载因子,以便最大限度地减少rehash操作次数,所以,一般在使用HashMap时建议根据预估值设置初始容量,减少扩容操作。...,a越大,空间利用率越高,为了兼顾哈希冲突和存储空间利用率,通常将a控制在0.6-0.9之间,.netHashTable则直接将a最大值定义0.72 (虽然微软官方MSDN声明HashTable

13820

.net源码分析 - ConcurrentDictionary

前言 ConcurrentDictionary一大特点是线程安全,在没有ConcurrentDictionary之前在多线程下用Dictionary,不管读写都要加个锁,不但麻烦,性能上也不是很好,因为在上篇分析我们知道...不过凡事都有两面性,给每个Bucket都加一个锁也不可取,Bucket数量和Dictionary元素数量是一样Bucket可能会有一部分是空,而且访问Dictionary线程如果数量不是太多也根本用上不这么多锁...随着Dictionary扩容,锁个数也可以跟着增加,这个可以在构造函数自己指定。 下面看看ConcurrentDictionary里元素是做了怎样封装。...默认大小,和List,Dictionary不一样 private const int MaxLockNumber = 1024; //最大锁个数,不过也可以在构造函数弄个更大,不般没必要 看看构造函数初始化做了些啥...,比如32位上byte,int,byte,short都是原子long,double就不是了,支持原子操作直接赋值就可以了,得注意是值类型,引用类型可不能这么搞

1.2K50

Go语言中常见100问题-#21 Inefficient slice initialization

切片怎么初始化才有好性能 切片使用内置make函数进行初始化,初始化需要提供两个参数,分别是切片长度和容量(可选)。如果这两个参数设置不合理,会使得后续对切片操作非常低效。...这会导致GC需要付出额外努力来清理不在使用数组。如何进行优化呢?有两种不同方法,方法一代码逻辑与上述一致,唯一区别是一开始将切片容量设置给定要装素数量。...bars创建时其容量设置n....前面不是说方法3效率更高吗?如果我们使用给定长度不是容量,则实现代码如下。因为要通过索引给切片中元素赋值,程序看起来更复杂些。...例如,下面代码,输出切片大小依赖于条件函数 something(foo), 这种情况下,在初始化bars切片时候,是初始化为空,还是设置固定大小长度或容量呢?

23120

ConcurrentDictionary 对决 Dictionary+Locking

MSDN Dictionary 类文档线程安全描述中指出,如果你需要用一个线程安全实现,请使用 ConcurrentDictionary。...但不知道为什么MSDN 4.0 版本,关于 GetOrAdd 方法签名描述并没有包含一个需要传递一个委托类型参数说明。... Dictionary + Locks 却表现更快。这是为什么呢?...ConcurrentDictionary 使用了多种不同锁机制来允许并发地添加数据项,但是诸如决定使用哪个锁,改变 Bucket 尺寸请求锁等逻辑,并没有为此带来帮助。...但是,替换 Node 内容并不是一个原子操作,这也是导致其线程不安全因素之一。因为 Node 都是对象,一个 Node 被初始化创建,然后一个单独引用会被更新用于指向它(此处是原子操作)。

1.5K70

DotNet Dictionary 实现简介

_buckets 是一个int数组,结构比较简单,数组大小是当前Dictionary实际容量大小,不是Count值(这个很大可能并不是初始化时用户指定大小) _buckets数组里每个元素实际上包含...这里capacity是用户设置容量,size是这个Dictionary真正大小,count当前Dictionary存储了多少个真正数据 比如使用Dictionary(2)初始化时 capacity...2.4:官方文档 下面是主要2份官方文档 Dotnet Source Browser : https://source.dot.net/#System.Private.CoreLib/Dictionary.cs...下文图例buckets,entries结构里数据都是真实数据(内存里就是这些确切值),不是为了演示创造示例数据。...1来作为dc容量,它使用大于1第一个素数即3,所以执行初始化后dcsize会变成3,bucket与entries里数据也都是初始值,int类型全部0,引用类型null。

30110

C#如何使用Parallel.For和Parallel.ForEach

本文讨论了如何在.NET Core应用程序中使用并行性。若要使用本文提供代码示例,您应该在系统安装Visual Studio 2019。...在本文后续部分,我们将使用该项目来说明.NET Core并行编程。 .NET Core并发性和并行性 并发和并行性是.NET和.NET Core两个关键概念。...以下两种方法都使用IsPrime方法检查整数是否质数,将质数和托管线程ID存储在ConcurrentDictionary实例,然后返回该实例。第一种方法使用并发,第二种方法使用并行性。...如果MaxDegreeOfParallelism设置-1,则并发运行任务数没有限制。 以下代码段显示了如何设置MaxDegreeOfParallelism以使用最多75%系统资源。...你可以阅读有关任务并行微软在线文档这些和其他潜在陷阱在这里。 关注苏州程序大白,持续更新技术分享。谢谢大家支持

5.7K20

JAVA集合之ArrayList源码分析

简介 ArrayList概述 ArrayList是我们开发中非常常用数据存储容器之一,其底层是数组实现,我们可以在集合存储任意类型数据,ArrayList是线程不安全,非常适合用于对元素进行查找...ArrayList集合源码分析 首先看看ArrayList结构图 分析结构 为什么要先继承AbstractList,让AbstractList先实现List?...不是让ArrayList直接实现List?...>> 1); //前面的初始容量10就是这个判断进行准备,所以这里就是真正初始化elementData大小了 if (newCapacity - minCapacity < 0...,新数组对象长度第二个参数值,然后会将原来值copy到新数组 这里有篇博客通俗易懂代码案例:https://blog.csdn.net/qq_25131363/article/details

24430

hashCode 为什么乘以 31?深入理解 hashCode 和 hash 算法

在java乘法如果数字相乘过大会导致溢出问题,从而导致数据丢失,31则是素数(质数)而且不是很长数字,最终它被选择相乘系数原因。 可以看到,使用 31 最主要还是为了性能。...自从有了阿里规约插件,每次楼主都要初始容量,如果我们预计我们散列表中有2个数据,那么我就初始容量2吗?...绝对不行,如果大家看过源码就会发现,如果Map已有数据容量达到了初始容量 75%,那么散列表就会扩容,扩容将会重新将所有的数据重新散列,性能损失严重,所以,我们可以必须要大于我们预计数据量 1.34...当然这是开玩笑,2.68 不可以,3 可不可以呢?肯定也是不可以,我前面说了,如果不是2幂次方,散列结果将会大大下降。导致出现大量链表。那么我可以将初始容量设置4。...当然了,如果你预计大概会插入 12 条数据的话,那么初始容量16简直是完美,一点不浪费,而且也不会扩容。

2.4K21

使用集合组织相关数据

实际包含素数             Capacity 获取ArrayList容量    返回值类型          方法名称            说明      int  Add...(Collection Initializers)构造集合       通过集合初始化器,无须在代码中指定多个对该类Add()方法调用,编译器会添加这些调用,从而节省了很多编码工作       示例代码...,容量0     开始出现,容量4     每次超过当前容量容量(当前容量*2)     扩容触发时机是在调用Add()方法时候     简单示例代码:     int[] nums = new...Console.WriteLine(item.Value); } #endregion          KeyValuePair是一个泛型结构,定义可设置或检索键...这部分就不多做结束,大家可以通过MSDN了解 ★注:泛型集合可以作为类一个属性,使用泛型集合必须实例化~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

75180

动手学DL——MLP多层感知机【深度学习】【PyTorch】

多层感知机是通用近似器, 即使是网络只有一个隐藏层,给定足够神经元和正确权重, 可以对任意函数建模。 通过使用更深(不是更广)网络,可以更容易地逼近许多函数。...2)Sigmoid sigmoid(x) = \frac{1}{1+e^{-x}} 它将范围(-inf, inf)任意输入压缩到区间(0, 1)某个值。...为什么要引入非线性变换? 非线性变换比线性变换有更强表达能力。可逼近任意复杂函数,更加贴合真实世界问题,现实世界单调、线性是极少存在。 例如,如果我们试图预测一个人是否会偿还贷款。...(该例来自 DIVE INTO DEEP LEARNING) softmax 函数与隐层激活函数区别? softmax 函数主要用于输出层,不是隐藏层。...Dropout 正则化:在训练过程,随机地将一些神经元输出设置零,以降低神经网络复杂性。

64040

硬核 | Redis 布隆(Bloom Filter)过滤器原理与实战

码哥,为什么不允许删除元素呢? 删除意味着需要将对应 k 个 bits 位置设置 0,其中有可能是其他元素对应位。...订单同步到布隆过滤器 在添加到布隆过滤器之前,我们通过BF.RESERVE命令手动创建一个名字 orders error_rate = 0.1 ,初始容量 10000000 布隆过滤器: # BF.RESERVE...; error_rate:期望错误率,默认 0.1,值越低,需要空间越大; capacity:初始容量,默认 100,当实际元素数量超过这个初始容量时,误判率上升。...2 倍扩容; NONSCALING:可选参数,设置此项后,当添加到布隆过滤器数据达到初始容量后,不会扩容过滤器,并且会抛出异常((error) ERR non scaling filter is...布隆过滤器 capacity 设置过大,会浪费存储空间,设置过小,就会影响准确率,所以在使用之前一定要尽可能地精确估计好元素数量,还需要加上一定冗余空间以避免实际元素可能会意外高出设置值很多。

4.1K10

ConcurrentDictionary线程不安全么,你难道没疑惑,你难道弄懂了么?

话题 本节内容算是非常老一个知识点,在.NET4.0就已经出现,并且在园已有园友作出了一定分析,为何我又拿出来讲呢?理由如下: (1)没用到过,算是自己一次切身学习。...在.NET1.0出现了HashTable这个类,此类不是线程安全,后来为了线程安全又有了Hashtable.Synchronized,之前看到同事用Hashtable.Synchronized来进行实体类与数据库表进行映射..., 园已有大篇文章说ConcurrentDictionary不是线程安全。...此时我们看到确确实实获得了相同值,但是却运行了两次,为什么会运行两次,此时第二个线程在运行调用之前,第一个线程值还未进行保存导致。...上述在ConcurrentDictionary为了两个方法能保证线程安全我们利用Lazy来实现,默认模式 LazyThreadSafetyMode.ExecutionAndPublication

60530

ConcurrentDictionary字典操作竟然不全是线程安全

,这两个api不是原子性,需要引起重视。...) 整个过程涉及与字典直接交互都用到精细锁,valueFactory工厂函数在锁定区外面被执行,因此,这些代码不受原子性约束。...Q1: valueFactory工厂函数不在锁定范围,为什么不在锁范围? A: 还不是因为微软不相信你能写出健壮业务代码,未知业务代码可能造成死锁。...; ④ 多个线程尝试执行Lazy.Value, 但这个延迟初始化方式被默认设置ExecutionAndPublication: 不仅以线程安全方式执行, 而且确保只会执行一次构造函数。...• https://andrewlock.net/making-getoradd-on-concurrentdictionary-thread-safe-using-lazy/ ---- 总结 解决ConcurrentDictionary

35040

如何在Go中使用切片容量和长度

等一下为什么不是 [01234]? 如果答错了,也不担心。从其他语言过渡到Go时,这是一个相当普遍错误,在本文中,我们将介绍为什么输出不符合你预期以及如何利用Go细微差别来提高代码效率。...我们将一个数组其大小设置20,但是由于我们仅使用一个子集,因此我们代码可以假装数组长度5,然后在向数组添加新项后为6。...虽然这看起来似乎是我们最初想要,但这里重要区别是我们告诉切片要将长度和容量设置5,make 将切片初始化为 [0,0,0,0,0]然后继续调用 append函数,因此它将增加容量并在切片末尾开始添加新元素...首先,新切片长度将设置0,因此我们没有在切片中添加任何新元素。第二个参数是新切片容量,将被设置map参数长度,因为我们知道切片最终长度就是 map 长度。...本文并不是要对切片或数组之间差异进行详尽讨论,只是要简要介绍容量和长度如何影响切片以及它们在不同解决方案作用。

68010

浅谈ArrayList动态扩容

这里size是ArrayList一个int型私有变量,用于记录该list集合当前元素数量,注意不是容量。...再来看看带初始容量构造方法: 从源码里可以看出:首先对传进来初始化参数initialCapacity进行判断,如果该参数大于0,在elementData进行初始化,初始化为一个容量initialCapacity...,还没有说到无参构造函数默认是空数组,为什么注释说是容量10数组,也还没说到当容量不足时,是如何实现动态扩容,下面就通过add方法来说明这些问题。...,所以如果没有指定大小的话,默认是初始化一个容量10数组。...其实不然,每次增长原来1.5倍实际增长量会越来越大,可以看看网友统计数据(参考: http://blog.csdn.net/java2000_net/article/details/5215882

46950

*HashMap实现原理及源码学习(JDK 1.8.0)*

(如有错误之处,欢迎指正) 一、前言部分注释 image.png 译>:HashMap实例有两个影响其性能参数——“初始容量initial capacity”和“负载因子load factor”,容量指的是哈希表桶...(buckets)数目,初始容量即为创建哈希表时桶数目;负载因子是衡量哈希表在自动扩容之前填充程度度量,即当哈希表条目数超过(负载因子与当前容量乘积)时,哈希表将会自动扩容原来桶数目的2...设置初始容量时,应考虑映射中预期条目数和负载因子,以最大程度地减少重新哈希操作数量,如果,初始容量大于预期条目数除以负载因子(即 初始容量*负载因子 > 预期条目数),则不会发生任何重新哈希操作。...二.HashMap内部实现机制 1.HashMap基本属性 image.png 注:使用无参构造new一个HashMap实例时候,系统会默认指定初始容量16(24次方),当然我们也可以通过有参构造自己指定初始容量大小...(由于迭代遍历所需时间与桶数量以及键值映射对数量成正比,因此如果迭代性能很重要,则不要将初始容量设置过大(负载率过低)) image.png image.png 注:如图所示,Node是

40200

Go语言核心36讲(Go语言进阶技术一)--学习笔记

切片长度可以自动地随着其中元素数增长增长,但不会随着元素数减少减小。 我们其实可以把切片看做是对数组一层简单封装,因为在每个切片底层数据结构,一定会包含一个数组。...通过调用内建函数cap,我们可以得到它们容量。 但要注意,数组容量永远等于其长度,都是不可变。切片容量不是这样,并且它变化是有规律可寻的。...这道题典型回答:切片s1和s2容量分别是5和8。 问题解析 解析一下这道题。s1容量为什么是5呢?因为我在声明s1时候把它长度设置成了5。...当我们用make函数初始化切片时,如果不指明其容量,那么它就会和长度一致。如果在初始化时指明了容量,那么切片实际容量也就是它了。这也正是s2容量是8原因。...每个小格子都对应着其底层数组某一个元素。 我们继续拿s2例,这个窗口最左边那个小格子对应正好是其底层数组第一个元素,即索引为0那个元素。

25601

深入理解 hashcode 和 hash 算法

使用素数好处并不很明显,但是习惯上使用素数来计算散列结果。...自从有了阿里规约插件,每次楼主都要初始容量,如果我们预计我们散列表中有2个数据,那么我就初始容量2嘛?...绝对不行,如果大家看过源码就会发现,如果Map已有数据容量达到了初始容量 75%,那么散列表就会扩容,扩容将会重新将所有的数据重新散列,性能损失严重,所以,我们可以必须要大于我们预计数据量 1.34...当然这是开玩笑,2.68 不可以,3 可不可以呢?肯定也是不可以,我前面说了,如果不是2幂次方,散列结果将会大大下降。导致出现大量链表。那么我可以将初始容量设置4。...当然了,如果你预计大概会插入 12 条数据的话,那么初始容量16简直是完美,一点不浪费,而且也不会扩容。

2.3K31

HashMap源码解读(下篇)

第一次使用(添加)时才初始化相应内存。 3.2 有参构造器如下: 如图红色框框,代码检查传入参数是否2n次幂,若不是调整最接近 2^n 数。...0 : oldTab.length;//现在hash表容量,第一次无参构造函数初始化时0,指数组长度,即老素数组长度 int oldThr = threshold;//现在扩容前临界值...* 如果扩容之后容量小于最大容量 并且老数组容量大于等于默认初始容量(16),那么新数组扩容阀值设置老阀值2倍。...0,那么设置新数组容量该阀值 * 这一步也就意味着构造该map时候,指定了初始容量。...,初始容量大小(首次初始化) newCap = DEFAULT_INITIAL_CAPACITY;//第一次创建,使用默认值生成相关参数 // 设置新数组扩容阀值

35230
领券