1

次のメンバー式を検討してください

someObject.someMethod(p => p.FirstName)
someObject.someMethod(p => p.Contact.Address.City)

式をたどり、各メンバーを調べて、特定の属性で装飾されているかどうかを判断するコードを書いています。これの目的は、次のような「パス」を生成することです。

p.Contact.Address.City -> "Contact.Address.City"

ただし、特定の属性で装飾されている場合、パスは別の名前で生成されます。

...
[BsonElement("Locale")]
public string City {get; set;}
...

p.Contact.Address.City -> "Contact.Address.Locale"

参考までに: これは、MongoDB を操作するために作成している小さなライブラリ用です。

そのため、式のウォークと属性のチェックは、リフレクションを使用して行われます。それほど遅くはありませんが、改善の余地があります。

パス解決 (MemberExpression を文字列に) にキャッシングを追加したいのですが、MemberExpression の署名\ハッシュを生成するための最良\最も効率的な方法がわかりません。

いくつか試してみましたが、実際にはコードの速度が低下しました。このメソッドは、ルックアップに使用できるように毎回ハッシュを生成するのに十分な速さである必要があり、明らかに式をたどるよりも高速である必要があります。

何かご意見は?

編集: コードはこちら: https://github.com/bryanmig/MongoFluentUpdater/blob/master/FluentUpdate/FluentUpdater.cs (改善の余地があることはわかっていますが、初期のプロトタイプです)

4

1 に答える 1

0

コードの実行中は結果が変更されないため、リフレクション作業の結果を常にキャッシュする必要があります(動的なアセンブリのロード/生成を大量に行う場合を除く)。式をウォークスルーしているコードを共有できますか?これにより、キャッシングを組み込む必要がある場所を簡単に確認できるようになる可能性があります。

于 2012-05-05T00:53:22.890 に答える