2009-03-05 11 views
18

可能性の重複:
How costly is .NET reflection?リフレクションは本当に遅いので意味があるときは使用しないでください。

私が午前problemに「エレガント」ソリューションは、別のクラスで、そのプロパティを関連付けるための属性を使用することです。問題は、それを他のものに変換するために、私はリフレクションを使わなければならないということです。私は、クラウド上でホストされるサーバーサイドのアプリを検討しています。

「反射が遅い、使用しない」という多くのうわさが聞こえましたが、どのように遅いですか? CPUを集中的に使用しているため、私のCPU時間が劇的に増えて、クラウド上のアーキテクチャの最下部で反射を使用する決断をしていることになります。

答えて

28

あなたは元の質問にアップデートが表示されていない念のために:あなたがサポートするすべてのタイプを見つけることが反映されたときにここで

EDIT

は私が読んで覚えて一つの資源であります特定の属性、あなたはキャッシングを使用する絶好の機会を持っています。つまり、実行時にリフレクションを複数回使用する必要はありません。

一般的な質問に答えるために、リフレクションは生のコンパイルされたメソッド呼び出しよりも遅いですが、データベースやファイルシステムにアクセスするよりはるかに高速であり、事実上すべてのWebサーバーがこれらのことを常に行います。

+0

Genius(+4文字) –

+2

+1結果をキャッシュします。あなたがファイルシステムからの情報を読むのと同じようにリフレクションを扱うなら、間違っていないでしょう。 – stevemegson

8

おそらくそれに気付かないこともあります。最適化について考える前に、常に最初にプロファイルを作成してください。

15

ファイルシステムのアクセスよりも何倍も高速です。

ネットワーク経由のデータベースアクセスよりも何倍も高速です。

ブラウザにHTTP応答を送信するよりも何倍も何倍も高速です。

4

私は同じことを考えました。しかし、反射がそれほど悪くないわけではないことが分かります。私はリソースを見つけることができません(私はそれらを見つけるときにそれらをリストしようとします)が、私はおそらく2倍から3倍遅いと読んで覚えていると思います。速いスピードの50%か33%はまだ速いです。

また、私はASP.netのwebformsとMVCの下でリフレクションをしていますので、どの程度遅くなるのでしょうか? .Net Reflection and Performance

3

ええと、私はできる限り反射を避けようとしますが、解決策を作成しなければならないと、反射が私に問題を解決するエレガントな方法を与えてくれます。私はうんざりして反射を使用します。

しかし、反射を「汚いトリック」に使うべきではないと言わなければなりません。この瞬間、私はカスタム属性を使っていくつかのクラスを飾るソリューションにも取り組んでいます。そして、はい、クラス/プロパティ/私のカスタムで装飾されているかどうかを知るためにリフレクションを使用する必要があります属性。

「反射呼び出しはどれくらいですか」の問題だと思いますか? できれば、結果をキャッシュしようとしています。 同様に、私が取り組んでいるソリューションでは、アプリケーションの起動時に、特定のアセンブリの特定の型を検査します。その型が自分の属性で修飾されているかどうかを検査し、辞書に保持します。

関連する問題