3

目前我正在使用 Microsoft Sync Framework 来同步数据库。我需要收集由 Microsoft Sync Framework 插入/更新/删除的每条记录的信息,并对这些信息进行处理。

同步速度可以超过每分钟 50.000 条记录。所以这意味着我的附加代码需要非常轻量级,否则将是巨大的性能损失。

Microsoft Sync FrameworkSyncProgress为每条记录引发一个事件。我订阅了这样的代码:

// 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;
    }
}

在另一个程序集中的其他地方,我有三种方法:

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

Assembly2有参考Assembly1。所以对需要处理收集到的信息Assembly1的类的存在一无所知。SyncInformation所以我有以下选项来触发此代码:

  1. Assembly2
    在1.1中使用事件并订阅它。事件处理程序<>
    1.2。行动<>
    1.3。代表们
  2. 使用依赖注入:
    public class Assembly2.SyncInformation : Assembly1.ISyncInformation
  3. 其他?

我知道性能取决于:

  • OnSyncProgress
    • 转变
    • 使用方法调用、委托、Action<> 或 EventHandler<>
  • SyncInformation 类的实现

我目前不关心SyncInformation类的实现。我主要关注OnSyncProgress方法以及如何调用SyncInformation方法。

所以我的问题是:

  • 最有效的方法是什么?
  • 什么是最无效的方法?
  • 有没有比使用 switch in 更好的方法OnSyncProgress
4

1 回答 1

10

同步速度可以超过每分钟 50.000 条记录。所以这意味着我的附加代码需要非常轻量级,否则将是巨大的性能损失。

不,不会的。

50k / 分钟并不是大量的方法调用,除非您需要在每条记录中进行数千次这样的调用。这有点过早优化的味道。如果我们忽略故意写得不好的代码和每次调用的反射,调用方法的绝对最慢的方法是通过无类型委托DynamicInvoke,并且可以在我的机器上在 42 毫秒内完成 50k 次调用。其他任何东西(类型化委托Invoke、直接callvirt在类或接口上dynamic、静态call等)甚至都无法测量(例如:对于 50k 次调用,它实际上是 0 毫秒)。

IMO,您最好使用分析器来查看真正重要的内容。它几乎肯定是“做”代码,而不是管道。

于 2012-11-28T13:04:22.780 回答