Reflectionの速度は?
質問
最近、DataAccessProviderをビジネスロジック層から区別するために、インターフェース層を作成しました。 このアプローチでは、Web/App.Config.の値を変更することによって、いつでも好きなときにDataAccessProviderの選択を変更することができます。 (必要であれば、より詳細な情報を提供することができます)。
とにかく、これを行うために、私たちが作業できるDataProviderクラスを達成するために、リフレクションを使用します。
/// <summary>
/// The constructor will create a new provider with the use of reflection.
/// If the assembly could not be loaded an AssemblyNotFoundException will be thrown.
/// </summary>
public DataAccessProviderFactory()
{
string providerName = ConfigurationManager.AppSettings["DataProvider"];
string providerFactoryName = ConfigurationManager.AppSettings["DataProviderFactory"];
try
{
activeProvider = Assembly.Load(providerName);
activeDataProviderFactory = (IDataProviderFactory)activeProvider.CreateInstance(providerFactoryName);
}
catch
{
throw new AssemblyNotFoundException();
}
}
でも今思ったけど、リフレクションってこんなに遅いのか?
どのように解決するのですか?
ほとんどの場合:十分すぎるほど高速です。例えば、DALのラッパーオブジェクトを作成するためにこれを使用する場合、リフレクションによってオブジェクトを作成するのにかかる時間は 極小 ネットワークに接続するのに必要な時間と比較して、です。ですから、これを最適化することは時間の無駄でしょう。
タイトなループでリフレクションを使用している場合、それを改善するためのトリックがあります。
-
ジェネリックス (ラッパー
where T : new()
とMakeGenericType
) -
Delegate.CreateDelegate
(型付きデリゲートへ。コンストラクタでは動作しません) -
Reflection.Emit
- ハードコア -
Expression
(例Delegate.CreateDelegate
と似ていますが、より柔軟で、コンストラクタで動作します。)
しかし、あなたの目的のために
CreateInstance
は全く問題ありません。それにこだわって、物事をシンプルに保ちましょう。
編集:相対的なパフォーマンスについての指摘はそのままで、最も重要なことである「測定する」ことはそのままですが、上記のいくつかを明確にする必要があります。時々...それは
はします。
の問題です。まずは測ってみてください。しかし、もしあなたがそれを見つけた場合
は
が遅すぎると感じたら、次のようなものを見てみるといいかもしれません。
FastMember
のような、すべての
Reflection.Emit
のコードをバックグラウンドで静かに実行し、素晴らしい簡単な API を提供します。
var accessor = TypeAccessor.Create(type);
List<object> results = new List<object>();
foreach(var row in rows) {
object obj = accessor.CreateNew();
foreach(var col in cols) {
accessor[obj, col.Name] = col.Value;
}
results.Add(obj);
}
これは単純ですが、非常に高速になります。具体的な例では、DALラッパーについて触れていますが、もしあなたがこれをたくさんやっているのなら、次のようなものを考えてみてください。
ダッパー
のようなものを考えてみてください。これはまた、すべての
Reflection.Emit
のコードをすべてバックグラウンドで行い、可能な限り高速で、かつ使いやすいAPIを提供します。
int id = 12345;
var orders = connection.Query<Order>(
"select top 10 * from Orders where CustomerId = @id order by Id desc",
new { id }).ToList();
関連
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み] リフレクションを使用して文字列からプロパティ値を取得する
-
[解決済み] enumを列挙するには
-
[解決済み] intをenumにキャストするにはどうすればよいですか?
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
-
[解決済み] リフレクションを使ってジェネリックメソッドを呼び出すにはどうしたらいいですか?
-
[解決済み] Typeから新しいオブジェクトのインスタンスを作成する方法
-
[解決済み] C#のリフレクションで型がインターフェースを実装しているかどうかを判断する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み】2年前のMSDateを把握する【クローズド
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない
-
[解決済み】ユーザー設定値を別のユーザー設定値で設定する
-
[解決済み】.NETリフレクションのコストはどれくらい?