3

現在、データベースの同期にMicrosoftSyncFrameworkを使用しています。Microsoft Sync Frameworkによって挿入/更新/削除されたレコードごとに情報を収集し、この情報を使用して何かを行う必要があります。

同期速度は1分あたり50.000レコードを超える可能性があります。つまり、追加のコードは非常に軽量である必要があります。そうしないと、パフォーマンスが大幅に低下します。

Microsoft Sync Frameworkは、SyncProgressレコードごとにイベントを発生させます。私はこのようなコードを購読しています:

// Assembly1
SyncProvider.SyncProgress += OnSyncProgress;
// ....
private void OnSyncProgress(object sender, DbSyncProgressEventArgs e)
{
    switch (args.Stage)
    {
        case DbSyncStage.ApplyingInserts:
            // MethodCall/Delegate/Action<>/EventHandler<> => HandleInsertedRecordInformation 
            // Do something with inserted record info
            break;
        case DbSyncStage.ApplyingUpdates:
            // MethodCall/Delegate/Action<>/EventHandler<> => HandleUpdatedRecordInformation  
            // Do something with updated record info
            break;
        case DbSyncStage.ApplyingDeletes:
            // MethodCall/Delegate/Action<>/EventHandler<> => HandleDeletedRecordInformation
            // Do something with deleted record info
            break;
    }
}

別のアセンブリのどこかに、3つの方法があります。

// Assembly2
public class SyncInformation
{
    public void HandleInsertedRecordInformation(...) {...}
    public void HandleUpdatedRecordInformation(...) {...}
    public void HandleInsertedRecordInformation(...) {...}
}

Assembly2への参照がありAssembly1ます。したがって、収集された情報を処理する必要があるクラスAssembly1の存在については何も知りません。SyncInformationしたがって、このコードをトリガーするための次のオプションがあります。

  1. Assembly2
    イベントを使用し、 1.1でサブスクライブします。EventHandler<>
    1.2。アクション<>
    1.3。代表者
  2. 依存性注入の使用:
    public class Assembly2.SyncInformation : Assembly1.ISyncInformation
  3. 他の?

私はパフォーマンスが以下に依存することを知っています:

  • OnSyncProgress
    • スイッチ
    • メソッド呼び出し、デリゲート、Action<>またはEventHandler<>を使用する
  • SyncInformationクラスの実装

SyncInformation私は現在、クラスの実装については気にしません。私は主にOnSyncProgressメソッドとメソッドの呼び出し方法に焦点を当てていSyncInformationます。

だから私の質問は:

  • 最も効率的なアプローチは何ですか?
  • 最も非効率的なアプローチは何ですか?
  • でスイッチを使用するよりも良い方法はありOnSyncProgressますか?
4

1 に答える 1

10

同期速度は1分あたり50.000レコードを超える可能性があります。つまり、追加のコードは非常に軽量である必要があります。そうしないと、パフォーマンスが大幅に低下します。

いいえ、ありません。

レコードごとに何千ものそのような呼び出しを行う必要がない限り、50k/分はメソッド呼び出しの重要な数ではありません。これは時期尚早の最適化の悪臭です。意図的に不適切に記述されたコードと呼び出しごとのリフレクションを無視する場合、メソッドを呼び出す最も遅い方法は、型指定されていないデリゲートDynamicInvokeを使用することです。これにより、私のマシンで42ミリ秒で50kの呼び出しを実行できます。それ以外のもの(タイプされたデリゲート、クラスまたはインターフェースにInvoke直接、静的など)は測定できません(たとえば、5万回の呼び出しでは文字通り0ミリ秒になります)。callvirtdynamiccall

プロファイラーを使用して、実際に何が重要かを確認することをお勧めします、IMO。配管ではなく、ほぼ確実に「実行中」のコードになります。

于 2012-11-28T13:04:22.780 に答える