性能 - FunctionCall vs Event vs Action vs Delegate

时间:2012-11-28 12:53:28

标签: c# performance events dependency-injection delegates

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

同步速度可以超过每分钟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;
    }
}

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

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

Assembly2引用Assembly1。所以Assembly1对于需要处理收集信息的SyncInformation类的存在一无所知。所以我有以下选项来触发这段代码:

  1. 使用事件并在Assembly2中订阅 1.1。事件处理程序&LT;&GT;
    1.2。动作及LT;&GT;
    1.3。代表们
  2. 使用依赖注入:
    public class Assembly2.SyncInformation : Assembly1.ISyncInformation
  3. 其他?
  4. 我知道性能取决于:

    • OnSyncProgress
      • 开关
      • 使用方法调用,委托,操作&lt;&gt;或EventHandler&lt;&gt;
    • SyncInformation类的实现

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

    所以我的问题是:

    • 什么是最有效的方法?
    • 什么是效率最高的方法?
    • 有没有比使用OnSyncProgress中的切换更好的方法?

1 个答案:

答案 0 :(得分:9)

  

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

不,它不会。

50k /分钟不是大量的方法调用,除非您需要为每条记录执行数千次此类调用。这种过早优化的臭味。如果我们忽略故意编写错误的代码和每次调用的反射,那么调用方法的 绝对最慢 方式是通过无类型委托DynamicInvoke,这可以在我的机器上在42ms内完成50k的通话。其他任何内容(类型代理Invoke,直接callvirt在类或接口上,dynamic,静态call等等甚至都无法衡量(例如:它将是字面意思50k电话0ms。

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

相关问题