2009-06-29 9 views
3

最近、私は/ラムダ式を利用している、私のコードの一部で診断ログの多くを持っていることのパターンにそのような匿名のデリゲート取った:LogVerboseへの2番目の引数があることを匿名の代理人が多すぎる可能性はありますか?

MyEventManager.LogVerbose(LogCategory.SomeCategory,() => String.Format(msg_string, GetParam1(), GetParam2(), GetParam3()); 

お知らせ文字列に評価されるラムダ式。この理由は、詳細なログが実際に有効になっていない場合、パフォーマンスの影響を最小限に抑えるために、LogVerboseはできるだけ作業を終了して終了する必要があるためです。エラーメッセージ文字列の構築には、時間やリソースが必要な場合があります。ラムダ式が評価されない場合は、パフォーマンスペナルティは発生しません。

私はこのような多くの匿名の代理人がアプリケーションのパフォーマンスに予期しない結果をもたらすタイプのシステムを浪費しているのか、他の戦略があるかどうかを考えています。

答えて

2

大丈夫です。特に、匿名関数が何かを取得しない場合は、静的フィールドとしてキャッシュされます(できるだけ)。 "this"をキャプチャすると、新しいデリゲートインスタンスが作成されますが、コストはかかりません。

ローカル変数を取得する場合は、ネストされた型をインスタンス化する必要がありますが、実際に問題が発生した場合は、これについて心配しておきます。これまでの最適化と同様に、まず読みやすさに焦点を当て、パフォーマンスを測定し、それをプロファイルして、作業に集中する必要がある場所を特定します。

+0

これは私が疑っていることですが、それは技術的正当性のためです。 – jlew

2

質問に対する答えを実際には分かっていませんが、C#でのプログラミングのより機能的なスタイルへの思い込みが、ある種のそのような表現の使用の限界。

2

私は数千の代議員がいる解決策を得ていますが、それでも機能します。ときどきVisual Studioはちょっとぎこちないですが、何百ものプロジェクトがあるかどうか、またはこれか他の要因が不明なのかどうかです。アプリケーションのパフォーマンスは、大きな影響を受けるようには見えません(かなりのパフォーマンステストで)。

関連する問題