Lequel des deux morceaux de code suivants fonctionnera le mieux dans différents cas et pourquoi?GetOrAdd new vs performance d'usine
.
private readonly ConcurrentDictionary<int, List<T>> _coll;
_coll.GetOrAdd(1, new List<T>());
Cela crée une nouvelle List
à chaque appel, même quand il est pas nécessaire (Combien cette déclaration d'importance encore si nous passons la capacity
comme 0?).
.
private readonly ConcurrentDictionary<int, List<T>> _coll;
_coll.GetOrAdd(1, (val) => new List<T>());
Cela crée seulement le List
à la demande, mais a un appel de délégué.
J'ai utilisé une liste '' titre d'exemple, la collecte effective à sa place est thread-safe. Aussi, en prenant la suggestion de Joseph, est-ce que '() => Enumerable.Empty ()' aide à la performance? –
Hele
En outre, cela semble dépendre de la version du framework utilisée (et de l'implémentation d'un nouveau comportement), comme dans le cas de .NET 4.5 où les modifications ont eu des effets secondaires indésirables. Reportez-vous à https://basildoncoder.com/blog/concurrentdictionary-getoradd-vs.html – Alex
@Hele Eh bien, si vous allez utiliser 'Enumerable.Empty()' alors un délégué n'est pas nécessaire.'Enumerable.Empty ()' lit juste un champ readonly statique. Cependant, je ne sais pas pourquoi vous utiliseriez une interface en lecture seule comme 'IEnumerable '. Je pense que cela rendrait les mises à jour plus difficiles, mais je devrais voir plus de code. –