this question今日、ConcurrentDictionary
のメソッドに関するいくつかのパフォーマンスの違いがわかりました。私はこれを早期のマイクロ最適化と見ていました。C#ラムダの割り当てと収集
しかし、私が誤解していない場合、ラムダをメソッドに渡すたびに、CLRはメモリを割り当て、適切なクロージャを渡し(必要な場合)それはしばらくしてから。
三つの可能性があります:閉鎖せずに
ラムダ:
// 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));
第三の場合は明らかに割り当てフリーで、もう一つは割り当てが必要になります。
しかし、(より新しいCLRバージョンでは)完全に割り振りのない最初のケース(キャプチャを持たないラムダ)ですか?また、これはランタイムの実装の詳細なのか、それとも標準で指定されているものなのでしょうか?