リフレクション:リフレクションの使用は、まだ「悪い」または「遅い」ですか?2002年以降、リフレクションで何が変わったのですか?


21

式または式ツリーを扱うとき、プロパティの値を設定および取得するためにリフレクションをたくさん使用していることに気付きました。リフレクションの使用がますます一般的になっているように思われました。検証用のDataAnotations、Attribute Heavy ORMなど

それで、もし何か変わったとしたら?機械の速度だけですか?リフレクションを高速化するためにフレームワークに変更がありましたか?

それとも実際に何も変わっていませんか?リフレクションを使用するのはまだ「悪い」ですか「遅い」ですか?


2
リフレクションは、直接呼び出しよりも常に低速です。これは、呼び出しているものが存在することを見つけて確認するためにいくつかの手順を実行する必要があるためです。
マイケルK

それは常に悪いことでした。
ラムハウンド

列挙型の1つの項目を取得するためにgettypeでReflectionを実行することは、Enum.Parse()で例外をスローするよりも30倍以上高速です。反射が時々勝ちます。
Brain2000

回答:


16

反射は悪くも遅くもない。これは単なるツールです。すべてのツールと同様に、特定のシナリオでは非常に価値があり、他のシナリオではそれほど価値がありません。

パフォーマンスが本当に問題になる場合は、常にFasterFlectなどのライブラリを使用できます。

さらなる参考
文献反射が非効率的な場合、いつ最適ですか?


またはdynamic-明らかに反射より一桁速い。
Oded

1
パフォーマンスはまったく問題ではありません。疫病のように、2002年に反射を避けていた人々を鮮明に覚えています。それから何が変わったのだろうか。
-blesh

3
@blesh:何もありません。人々は今ではそれをよく知っており、それを恐れてはいません。
ロバートハーベイ

5
私はすべてここに「私の芝生を下車」とLispはOOPは長い前にこれを持っていたと言うかもしれない存在 ...
マイケル・K

けっこうだ。過去10年間でマシンの速度が向上したことが違いを生んだのか、それともSystem.Reflectionに実際に変更が加えられてパフォーマンスが向上したのかと思っていました。
-blesh

17

人々が不必要にリフレクションを使用することを警戒する理由はパフォーマンスではありません:はい、リフレクションを使用するためのオーバーヘッドがありますが、多くの場合、問題を解決せずに解決するには、同等の複雑さを持つ別のアプローチが必要です。あまり重要ではありません(特にアプリケーションレベルの開発)。

リフレクションを使用すると、ソースコードに関して通常行うことができるいくつかの重要な仮定が破られ、「すべての参照を検索する」などのツールが確実に機能しなくなります。また、リフレクションは、コンパイラがC#などで実施するほとんどのタイプセーフを基本的に削除し、タイプシステムが通常キャッチしてコンパイラエラーに変換するプログラミングエラーのほとんどを除去します。

では、なぜ人々は反射を使用するのでしょうか?簡単に言えば、上記の問題にもかかわらず、非常に貴重なツールだからです。リフレクションを使用すると、動的プログラミングの利点の一部がC#などの静的で厳密に型指定された言語で得られ、動的プログラミング言語は最近、特にWebプログラミングの領域(PHP、Javascript、非常に顕著なPython)でメリットを発揮します、すべてが動的型付けを使用し、Webプログラミングに適していることが証明されています。しかし、言語はまだC#で​​あるため、アプリケーションのほとんどを厳密に型指定されたOOPイディオムに保ち、動的な振る舞いがリフレクションと実際に違いを生じる小さな部分を記述することを選択できます。

典型的な例は、メソッドをWebサービス呼び出しとして公開する必要がある場合です(まだ.NETに組み込まれていないプロトコルを使用)。厳密に型指定されたOOPアプローチは機能しますが、制限が厳しく、扱いにくいです。ただし、リフレクションを使用してメソッドの呼び出しとキー/値のペアを引数にマッピングする場合、そのようなWebサービスの配管を一度記述してから、任意のクラスで使用できます。


13

リフレクションは、直接呼び出しよりもかなり遅くなります。次の2つのことが変更されました。

  • ランタイムはリフレクションメカニズムを最適化しているため、差は小さくなっています。
  • CPUが高速になったため、小さな非効率性が許容されやすくなりました

これらの2つの要因により、リフレクションのコストが日常的に使用できるポイント(保守性POVから適切な場合)まで引き下げられ、プロファイラーが実際にボトルネックであるかどうかを確認するまで待機します(そして、そうではない時)。


4
残念ながら、CPUは遅くなりました。通常はモバイルデバイス、および実行コストのために人々がサーバーの効率を可能な限り絞り込もうとしているサーバーです。
gbjbaanb

@gbjbaanb:モバイルデバイスを提供しますが、サーバーでは、コードの最適化よりもハードウェアの購入が大部分のケースで受け入れられ、合理的な選択です。サーバーの購入と実行のコストは、コードの最適化のコスト。
マイケルボルグワード

2
状況によっては、サーバーのコストが開発コストを劇的に上回っています。大規模なスケールアウトスタイル。サーバーはバフですが、クライアントマシンよりもパフォーマンスがさらに重要になる場合があります。それはケースバイケースのシナリオです。
ティドゥスLord 12

1
@Lord Tydus:確かに、しかしあなたが説明するケースはまれな例外です。
マイケルボルグワード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.