1

リフレクションを介してロードされるクラスのコードの実行時(実行時)のパフォーマンスは、新しいキーワードを使用してクラスが作成されたときの同じコードと同じですか

はいと言います。しかし、私はこれについて、リフレクション指向のコードは常に遅いと信じている同僚と話し合っていました。

私の見解では、クラスが最初にロード/作成された方法に関係なく、JITコンパイラーはクラスがどのようにロードされたかを気にしないため、パフォーマンスは同じになります。

私は正しいですか?いずれにせよ、これを明確にするのに役立つ参考資料をいただければ幸いです。

(注:リフレクションと新しいキーワードを使用してクラスを作成するパフォーマンスについては話していません。作成後のクラスのメソッドで実際のコードを参照しています。)

4

3 に答える 3

1

はい、ロードするとパフォーマンスは同じになります。

リフレクションのパフォーマンスの低下は、アセンブリからのメタデータの読み取りに限定されますが、実行時間はまったく同じになります。つまり、インスタンスが作成され、そのインスタンスへの参照があると、他のクラス(JITコンパイルやすべてを含む)と同じように動作します。

于 2009-12-04T12:16:48.510 に答える
1

それはあなたがそれをどのように実行するかに依存します;-p

ロードされたタイプのメソッドに入ると、はい:通常のGITなどが通常適用されます(セキュリティチェックは、部分的に信頼されている場合は少し遅くなる可能性がありますが、それほどではないことに注意してください

ただし、最初に動的オブジェクトでコードを呼び出す必要があります。

  • 静的に認識されているインターフェイスまたは基本クラスにオブジェクトをキャストできる場合、それは同一になります。
  • これが不可能な場合でも、特定の操作を既知のデリゲートにバインドできる場合(たとえばFunc<string,int>、を介してDelegate.CreateDelegate)、ほぼ同じくらい高速になりますが、利便性は低下します。
  • を介してすべてを行う場合DynamicInvoke()、それはかなりの宝物のようになります。
  • 4.0では、dynamicタイプごとに最適化されたキャッシングを備えたダックタイピングを提供するという点で、中途半端な家を提供する可能性があります。

だから:どのようにそれにアクセスしていますか?

于 2009-12-04T12:21:14.697 に答える
0

それはあなたが反射をどのように使うかに依存します。常に遅くなりますが、IL放出を使用して実行時にファクトリメソッドを作成すると、時間差を非常に小さくすることができます。単純なActivator.CreateInstanceを使用すると、非常に遅くなります。

于 2009-12-04T12:17:43.837 に答える