this question 오늘은 ConcurrentDictionary
메서드와 관련하여 약간의 성능 차이가 있음을 알았습니다. 조기 마이크로 최적화로 보았습니다.C# 람다 할당 및 수집
그러나 생각해 보면 (실수하지 않으면) 람다를 메서드에 전달할 때마다 CLR은 메모리를 할당하고 필요한 경우 적절한 클로저를 전달한 다음 수집해야합니다. 얼마 후. 조건 전에 확인 (같은
// this is definitely an allocation
return concurrent_dict.GetOrAdd(key, k => ValueFactory(k, stuff));
외부 검사 : 폐쇄없이
람다 : 폐쇄와
// 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));
람다
는 세 가지 가능성이 있습니다 자물쇠) :
// no lambdas in the hot path if (!concurrent_dict.TryGetValue(key, out value)) return concurrent_dict.GetOrAdd(key, k => ValueFactory(k));
세 번째 경우는 분명히 할당 - 무료이며, 두 번째는 할당이 필요합니다.
하지만 완전히 새로운 무료 CLR 버전에서는 첫 번째 경우 (캡처가없는 람다)가 완전히 할당되지 않습니다. 또한 이것은 런타임의 구현 세부 사항입니까, 아니면 표준에서 지정한 것입니까?