以下两段代码中的哪一段在不同情况下表现更好,为什么?GetOrAdd新vs工厂绩效
。
private readonly ConcurrentDictionary<int, List<T>> _coll;
_coll.GetOrAdd(1, new List<T>());
这将创建上不需要即使每次调用一个新的List
(多少钱,如果我们通过capacity
为0这个说法还是有关系吗?)。
。
private readonly ConcurrentDictionary<int, List<T>> _coll;
_coll.GetOrAdd(1, (val) => new List<T>());
这只会造成对需求的List
,但有一个委托调用。
我以'List'为例,其实际的集合是线程安全的。另外,从约瑟夫的建议中可以看出,'()=> Enumerable.Empty ()有助于表现吗? –
Hele
此外,它似乎取决于正在使用什么框架版本(以及是否实施了新行为),就像.NET 4.5中的情况一样,其中更改具有一些不良副作用。请参阅https://basildoncoder.com/blog/concurrentdictionary-getoradd-vs.html – Alex
@ Hele如果您打算使用Enumerable.Empty(),那么不需要委托。'Enumerable.Empty ()'只是读取静态只读字段。不过,我不确定为什么要使用像IEnumerable 这样的只读界面。我怀疑它会使更新更难,但我需要看到更多的代码。 –