Что занимает меньше процессорного времени / что быстрее / меньше загружается?AddOrUpdate или if / else с TryAdd? - PullRequest
0 голосов
/ 05 марта 2019

У меня есть KeyValuePairs, и я хочу добавить новое значение в ConcurrentDictonary. Если ключ не содержится, я хочу добавить его. Но что быстрее / лучше:

это:

dict.AddOrUpdate(pair.Key, pair.Value, (ok, ov) => pair.Value);

или это:

if (dict.ContainsKey(pair.Key))
{
    dict[pair.Key] = pair.Value;
}
else
{
    dict.TryAdd(pair.Key, pair.Value);
}

Я обеспокоен тем, что AddOrUpdate выполняет дополнительную работу, которая мне не нужна / не нужна, и что она занимает больше времени, потому что лямбда тоже должна выполняться.

Какой из этих двух методов быстрее? Или есть еще более быстрый метод?

1 Ответ

1 голос
/ 05 марта 2019

AddOrUpdate в параллельном словаре является атомарной операцией, если вы разделяете это на два вызова методов ContainsKey и TryAdd, он больше не атомарен и поэтому не использует цель параллельного словаря.В этом случае вам не нужно беспокоиться о производительности.

Я обеспокоен тем, что AddOrUpdate выполняет дополнительную работу, которая мне не нужна / не нужна

Два кода не являютсяэквивалент.если вы хотите безопасность потоков, используйте AddOrUpdate.если безопасность потока не является проблемой, тогда просто используйте Dictionary, который проще и быстрее, чем ConcurrentDictionary

, и это занимает больше времени, потому что лямбда тоже должна выполняться.

выполнение лямбд так же быстро, как и выполнение других методов (если вы не попадаете в микрооптимизацию конечно)

...