c# - 性能——FunctionCall vs Event vs Action vs Delegate

标签 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.事件处理器<
    1.2. Action <
    1.3.委托(delegate)们
  2. 使用依赖注入(inject):
    公共(public)类 Assembly2.SyncInformation : Assembly1.ISyncInformation
  3. 其他?

我知道性能取决于:

  • OnSyncProgress
    • 切换
    • 使用方法调用、委托(delegate)、Action<> 或 EventHandler<>
  • SyncInformation 类的实现

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

所以我的问题是:

  • 什么是最有效的方法?
  • 效率最低的方法是什么?
  • 有没有比在 OnSyncProgress 中使用开关更好的方法?

最佳答案

The sync speed can go over 50.000 records per minute. So that means my additional code need to be very lightweight otherwise it will be a huge performance penalty.

不,不会。

50k/分钟的方法调用次数并不多,除非您需要对每条记录进行数千次此类调用。这散发着过早优化的味道。如果我们忽略故意编写的糟糕代码和每次调用从头开始的反射,调用方法的绝对最慢方式是通过非类型化委托(delegate) DynamicInvoke,它可以在我的机器上在 42 毫秒内完成 50k 次调用。其他任何东西(类型委托(delegate) Invoke,在类或接口(interface)上直接 callvirtdynamic,静态 call 等)将甚至不可测量(如:对于 50k 次调用,它实际上是 0 毫秒)。

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

关于c# - 性能——FunctionCall vs Event vs Action vs Delegate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13605522/

相关文章:

java - 使用多线程的数独解算器

python - 是否有解决方法可以在单独的线程中清空事件队列?

c# - string.IndexOf 性能

c# - ASP.net - 用摄像头捕捉视频并在网页中播放

c# - 如何防止用户在 ComboBox 中写入内容?

c# - 计算与查找表的正弦值性能?

c# - : context. sleep.Where(o=>o.clientDateTime.TimeOfDay>new TimeSpan(18,0,0)).ToList(); 的任何解决方法

java - 如何提高Java多线程性能?从 NoSQL 数据库(如 Redis)与 ArrayList 保存/加载数据的时间效率?

c# - 调用 ASP.NET 用户控件事件时调用页面事件

c# - 如何在嵌入式 Firebird 数据库连接上使用事件?