C# の「is」リフレクションのパフォーマンス特性は何ですか?[重複]
-
09-06-2019 - |
質問
この質問にはすでに答えがあります:
- C# の「is」演算子のパフォーマンス 8 件の回答
その 示されている 'as' キャストはプレフィックス キャストよりもはるかに高速ですが、'is' リフレクションはどうなるのでしょうか?どれくらい悪い?ご想像のとおり、Google で「is」を検索するのはそれほど効果的ではありません。
解決
いくつかのオプションがあります。
- の クラシックキャスト:
Foo foo = (Foo)bar
- の
as
キャスト演算子:Foo foo = bar as Foo
- の
is
テスト:bool is = bar is Foo
- の クラシックキャスト かどうかを確認する必要があります
bar
安全にキャストできますFoo
(速い)そして実際にそれを実行する(遅い)か、例外をスローする(非常に遅い)。 - の
as
オペレーター かどうかを確認する必要がありますbar
キャストできる場合はキャストを実行するか、安全にキャストできない場合はそのまま戻りますnull
. - の
is
オペレーター かどうかを確認するだけですbar
Foo にキャストして、boolean
.
の is
テストは完全なキャスト操作の最初の部分だけを実行するため、迅速に実行できます。の as
演算子は、キャストが失敗しても例外をスローしないため、従来のキャストよりも高速です (これは、キャストが失敗する可能性が正当に予期される状況に適しています)。
変数かどうかを知りたいだけの場合は、 bar
です Foo
次に、を使用します is
オペレーター、 しかし, かどうかをテストする場合 bar
です Foo
, 、 そしてそうならば、 それからそれをキャストします, 、その場合は、を使用する必要があります as
オペレーター。
基本的にすべてのキャストは、 is
キャストが有効であることを確認するために、まず内部的にチェックします。したがって、次のことを行うと、 is
チェックの後にフルキャスト ( as
キャスト、または従来のキャスト演算子を使用して)、効果的に次のことを実行します。 is
2 回チェックするため、若干の余分なオーバーヘッドが生じます。
他のヒント
私がそれを学んだ方法は次のとおりです。
if (obj is Foo) {
Foo f = (Foo)obj;
f.doSomething();
}
これよりも遅いです:
Foo f = obj as Foo;
if (f != null) {
f.doSomething();
}
問題になるほど遅いですか?おそらくそうではありませんが、注意を払うのは非常に簡単なことなので、そうするのもよいでしょう。
「is」は基本的に「isinst」IL 演算子と同等です。この記事では高速であると説明されています。
問題にならない程度に速いはずです。パフォーマンスに顕著な影響を与えるほどオブジェクトのタイプをチェックしている場合は、設計を再考する必要があります。