今天我看到this question關於ConcurrentDictionary
方法的一些性能差異,我把它看作是一種過早的微觀優化。但是,經過一番思考,我意識到(如果我沒有弄錯),每次我們將一個lambda傳遞給一個方法時,CLR都需要分配內存,傳遞適當的閉包(如果需要的話),然後收集過了一段時間。C#lambda分配和集合
有三種可能性:
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));
拉姆達與閉合:
// 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));
第三種情況顯然是免分配的,第二種情況需要分配。
但是第一種情況(沒有捕獲的lambda)完全沒有分配(至少在更新的CLR版本中)?另外,這是運行時的實現細節,還是標準指定的東西?