Я видел this question сегодня о некоторой разнице в производительности в отношении ConcurrentDictionary
методов, и я видел ее как преждевременную микро-оптимизацию.C# лямбда-распределение и сбор
Однако, по некоторым соображениям, я понял (если не ошибаюсь), что каждый раз, когда мы передаем лямбду методу, CLR должно выделять память, передавать соответствующее закрытие (если необходимо), а затем собирать это через некоторое время.
Есть три варианта:
Lambda без закрытия:
// the lambda should internally compile to a static method, // but will CLR instantiate a new ManagedDelegate wrapper or // something like that? return concurrent_dict.GetOrAdd(key, k => ValueFactory(k));
Lambda с крышкой:
// this is definitely an allocation return concurrent_dict.GetOrAdd(key, k => ValueFactory(k, stuff));
Вне проверки (например, проверка состояния перед замок):
// no lambdas in the hot path if (!concurrent_dict.TryGetValue(key, out value)) return concurrent_dict.GetOrAdd(key, k => ValueFactory(k));
Третий случай, очевидно, распределение свободных, второй будет необходимо выделение.
Но это первый случай (лямбда, который не имеет захвата) полностью не содержит свободных (по крайней мере, в новых версиях CLR)? Кроме того, является ли эта деталь реализацией среды выполнения или что-то, указанное стандартом?